DP for C++

void dfs(int s, int e, int p, int q)
{
if (s > e) return;
int m = (s+e)>>1, opt;
D[m] = 1e18;
for (int k=p;k<=q&&k lld v = E[k] + (lld)(m-k-1)*(S[m]-S[k]);
if (D[m] > v)
D[m] = v, opt = k;
}
dfs(s, m-1, p, opt);
dfs(m+1, e, opt, q);
}


출처: http://blog.myungwoo.kr/96 [PS 이야기]

문제 : https://icpc.baylor.edu/download/worldfinals/problems/icpc2016.pdf

출처 맨 밑에 문제 해설이랑 C++ 코드 있습니다

이 코드를 C에서 동작하도록 바꾸고있는데

int m = (s+e)>>1, opt;

이 라인부터가 이해가 안되는데 비트이동연산자가 왜 갑자기 나오는건지

dfs함수가 어떻게 해서 그룹 코스트를 최소로 하는 값을 찾아내주는지 동작 방식좀 알려주시면 감사하겠습니다

그리고 지금 C로 작성한 코드는 graph의 사이즈를 그냥 크게 잡아놓고 priority queue랑 vector 부분 빼고 돌렸는데, C++코드에서는 vector랑 priority queue를 이용하더라구요...

최적화 하기 위해서 C에서 vector랑 priority queue를 구현해야할까요... 다른 방법은 없을까요?

이것땜에 다른거 아무것도 못하고 미치겠습니다 ㅠㅠ 도움좀 부탁드립니다...