#include <cstdio>
#include <iostream>
using namespace std;
int ans = 0;
void merge(int* l, int* mid, int *r)
{
int b[r-l];
int *i = l, *j = mid, cur = 0;
while(i<mid || j<r) {
if(i<mid && (j>=r || *i <= *j)) b[cur++] = *i++;
else {
b[cur++] = *j++;
ans += mid - i;
}
}
for(int *p=l, i=0; p < r; p++, i++) *p = b[i];
}
void merge_sort(int *l, int *r) // [ , )
{
if(r-l==1) return;
int* mid = l+(r-l)/2;
merge_sort(l, mid);
merge_sort(mid, r);
merge(l, mid, r);
}
int main ()
{
int a[] = {6,2,1,8,7,5,3,4};
// int a[] = {2,4,3,1};
int n = sizeof(a) / sizeof(int);
ans = 0;
merge_sort(a, a+n);
for(int i=0; i<n; i++) printf("%d ", a[i]);
printf("\n");
printf("逆序数为:%d\n", ans);
return 0;
}