int a[MAXN]; int N; int cnt = 0; void merge(int l,int m,int r); void merge_sort(int l,int r) { if ( l < r ) { int m = ( l + r ) >> 1; merge_sort(l,m); merge_sort(m + 1,r); merge(l,m,r); } } void merge(int l,int m,int r) { int n1 = m - l + 1; int n2 = r - m; int* A = (int *)malloc((n1 + 1) * sizeof(int)); int* B = (int *)malloc((n2 + 1) * sizeof(int)); A[n1] = B[n2] = 0x7fffffff; int i,j,k; for (i = 0, k = l; i < n1; i++,k++) A[i] = a[k]; for (j = 0, k = m +1; j < n2; j++,k++) B[j] = a[k]; i = j = 0; for ( k = l; k <= r; k++) { if ( A[i] <= B[j] ) { a[k] = A[i]; i++; } else { a[k] = B[j]; cnt += n1 - i; j++; } } free(A); free(B); }