树状数组求逆序对
int n;
struct st{
int v,id;
}a[N];
int tr[N],rk[N];
void add(int x,int k){
while(x<=n){
tr[x]+=k;
x+=lowbit(x);
}
}
int query(int x){
int res=0;
while(x){
res+=tr[x];
x-=lowbit(x);
}
return res;
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].v;
a[i].id=i;
}
sort(a+1,a+n+1,[&](st a,st b){return (a.v==b.v)?(a.id<b.id):(a.v<b.v);});
for(int i=1;i<=n;i++){
rk[a[i].id]=i;
}
int ans=0;
for(int i=1;i<=n;i++){
add(rk[i],1);
ans+=(i-query(rk[i]));
}
cout<<ans<<endl;
}