动态逆序对
#include
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ll long long
using namespace std;
const int N=4e5;
const int M=3e7+100;
int root[M],sum[M],pos[N],lc[M],rc[M],A[M],B[M],b[N],a[N],c[N],tot=0,n,m,x;
ll ans=0;
int lowbit(int x){return x&-x;}
void add(int x,int v)
{while(x<=n)c[x]+=v,x+=lowbit(x);}
int ask(int x)
{int sum=0;while(x)sum+=c[x],x-=lowbit(x);return sum;}
void update(int &o,int L,int R,int x,int v){
if(!o)o=++tot;
int M=L+R>>1;
sum[o]+=v;
if(L==R)return;
if(x<=M) update(lc[o],L,M,x,v);
else update(rc[o],M+1,R,x,v);
}
int querymore(int l,int r,int L,int R,int v){
int M=L+R>>1,tot=0;
if(M+1>v){
bool ok=0;
for(int i=r;i;i-=lowbit(i))tot+=sum[rc[A[i]]];
for(int i=l;i;i-=lowbit(i))tot-=sum[rc[B[i]]];
for(int i=r;i;i-=lowbit(i))A[i]=lc[A[i]],ok|=A[i];
for(int i=l;i;i-=lowbit(i))B[i]=lc[B[i]],ok|=B[i];
if(ok) return querymore(l,r,L,M,v)+tot;
return tot;
}else{
bool ok=0;
for(int i=r;i;i-=lowbit(i))A[i]=rc[A[i]],ok|=A[i];
for(int i=l;i;i-=lowbit(i))B[i]=rc[B[i]],ok|=B[i];
if(ok) return querymore(l,r,M+1,R,v);
return 0;
}
}
int queryless(int l,int r,int L,int R,int v){
int M=L+R>>1,tot=0;
if(M