O( nlog(n) )
/*
归并排序:
1.[L,R] ——> [L,mid][mid+1,R]
2.递归排序 [L,mid][mid+1,R]
3.归并,讲左右两个有序序列合成一个有序序列
解题思路:
1.左半边内部的逆序对数量:merge_sort(L,mid)
2.右半边内部的逆序对数量:merge_sort(mid+1,R)
3.右边比左边大的 S[j]=mid-i+1
*/
#include<iostream>
#define ll long long
using namespace std;
const int N=100010;
int n;
int q[N],tmp[N];
ll merge_sort(int l,int r) {
if(l>=r) return 0;
int mid=l+r>>1;
ll res = merge_sort(l,mid)+merge_sort(mid+1,r); //左半边+右半边
//归并的过程
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r) {
if(q[i]<=q[j]) tmp[k++]=q[i++];
else {
tmp[k++]=q[j++];
res += mid-i+1; //一左一右
}
}
//扫尾
while(i<=mid) {
tmp[k++]=q[i++];
}
while(j<=r) {
tmp[k++]=q[j++];
}
//物归原主
for(int i=l,j=0;i<=r;i++,j++)
q[i]=tmp[j];
return res;
}
int main() {
cin >> n;
for(int i=0;i<n;i++) cin >> q[i];
cout<<merge_sort(0,n-1)<<endl;
return 0;
}