归并排序求逆序对
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=100010;
ll ans=0;
int c[N],a[N],n;
void Merge(int l,int r){
int num=0;
int mid=(l+r)/2;
int p1=l,p2=mid+1;
while(p1<=mid || p2<=r){
if(p1>mid) {c[++num]=a[p2];p2++;continue;}
if(p2>r) {c[++num]=a[p1];p1++;continue;}
if(a[p1]<=a[p2]) {c[++num]=a[p1];p1++;continue;}
if(a[p1]>a[p2]) {c[++num]=a[p2];ans+=mid-p1+1;p2++;continue;}
}
for(int i=1;i<=num;i++) a[i+l-1]=c[i];
}
void MergeSort(int l,int r){
if(l<r){
int mid=(l+r)/2;
MergeSort(l,mid);
MergeSort(mid+1,r);
Merge(l,r);
}
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
MergeSort(1,n);
// for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("%lld\n",ans);
return 0;
}