归并排序及求逆序对数
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define mem(x,y) memset(x,y,sizeof x)
#define fo(i,s,t) for(int i=s;s<=t?i<=t:i>=t;s<=t?i++:i--)
#define pfo(i,s,t) for(int i=s;i<=t;i++)
#define nfo(i,s,t) for(int i=s;i>=t;i--)
#define cl1(x,y,n) fo(c1_i,0,n-1) x[c1_i]=y
#define cl2(x,y,n,m) fo(c2_i,0,n-1) fo(c2_j,0,m-1) x[c2_i][c2_j]=y
#define inf (~0U>>2)
#define inff (long long)(inf<<1)*(long long)(inf<<1)
using namespace std;
int a[1005000],b[1005000],cnt;
int merge_1(int l,int m,int r)
{
int i=l,j=m+1;
for(int k=l;k<=r;k++)
{
if(j>r||(i<=m&&a[i]<=a[j]))
b[k]=a[i++];
else
{
b[k]=a[j++];
cnt+=m-i+1;
}
}
for(int k=l;k<=r;k++)
{
a[k]=b[k];
}
return cnt;
}
void mergesort(int l,int r)
{
if(l<r)
{
int m=l+(r-l)/2;
mergesort(l,m);
mergesort(m+1,r);
merge_1(l,m,r);
}
}
int main()
{
int n;
cin>>n;
cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int l=0,r=n-1;
mergesort(l,r);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<"\n";
cout<<cnt<<"\n";
return 0;
}