void merge_sort(vector<int>& A, int l, int r){
if(l < r){
int m = (l+r) / 2;
merge_sort(A, l, m);
merge_sort(A, m+1, r);
merge(A, l, r);
}
}
void merge(vector<int>& A, int l, int r){
int m = (l+r) / 2, i = l, j = m+1, k = l;
vector<int> B(A.size());
while(i <= m && j <= r){
if(A[i] <= A[j]) B[k++] = A[i++];
else B[k++] = A[j++];
}
while(i <= m) B[k++] = A[i++];
while(j <= r) B[k++] = A[j++];
for(int i = l; i <= r; i++) A[i] = B[i];
}
int main(){
merge_sort(A, 0, A.size()-1);
}
ref: http://www.cs.umd.edu/~meesh/351/mount/lectures/lect6-divide-conquer-mergesort.pdf