我这里的MAXN要开到2e5,MAXLOG要开到50才能AC,如果少了就要WA或者RE,想问问为啥ORZ
(不是开nlogn的空间就可以了吗,MAXN为啥还要多一倍)
#include <iostream>
#include <cstdio>
#include <cstring>
#define mid ((x+y)>>1)
using namespace std;
typedef long long LL;
const int MAXN=1e5+5,MAXLOG=21,MAXT=MAXN*MAXLOG;
int a[MAXN],pst[MAXN];
int u[MAXLOG],v[MAXLOG],ulen,vlen;
int n,m;
LL ans;
struct BinaryIndexTree
{
int b[MAXN];
inline void Modify(int x) {for(;x<=n;x+=x&-x) b[x]++;}
inline int Query(int x,int ans=0) {for(;x;x^=x&-x) ans+=b[x];return ans;}
}BIT;
struct PresidentTree
{
int a[MAXT],l[MAXT],r[MAXT],root[MAXT],tot=0;
inline void Modify(int x,int y,int &pos,int p,int val)
{
if(!pos) pos=++tot;
a[pos]+=val;
if(x!=y)
{
if(p<=mid) Modify(x,mid,l[pos],p,val);
else Modify(mid+1,y,r[pos],p,val);
}
return;
}
inline int Query(int x,int y,int ql,int qr)
{
if(y<ql||x>qr) return 0;
if(ql<=x&&y<=qr)
{
int sum=0;
for(int i=1;i<=vlen;i++) sum+=a[v[i]];
for(int i=1;i<=ulen;i++) sum-=a[u[i]];
return sum;
}
int tempu[MAXLOG],tempv[MAXLOG];
for(int i=1;i<=vlen;i++) tempv[i]=v[i];
for(int i=1;i<=ulen;i++) tempu[i]=u[i];
for(int i=1;i<=vlen;i++) v[i]=l[v[i]];
for(int i=1;i<=ulen;i++) u[i]=l[u[i]];
int temp=Query(x,mid,ql,qr);
for(int i=1;i<=vlen;i++) v[i]=r[tempv[i]];
for(int i=1;i<=ulen;i++) u[i]=r[tempu[i]];
return temp+Query(mid+1,y,ql,qr);
}
}PT;
inline void Modify(int x,int val)
{
for(int i=x;i<=n;i+=i&-i) PT.Modify(1,n,PT.root[i],a[x],val);
return;
}
inline int Query(int l,int r,int x,int y)
{
ulen=vlen=0;
for(;r;r-=r&-r) v[++vlen]=PT.root[r];
for(--l;l;l-=l&-l) u[++ulen]=PT.root[l];
return PT.Query(1,n,x,y);
}
signed main(void)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",a+i),pst[a[i]]=i;
for(int i=1;i<=n;i++)
ans+=(i-1)-BIT.Query(a[i]),BIT.Modify(a[i]);
for(int i=1;i<=n;i++)
Modify(i,1);
for(int i=1,x;i<=m;i++)
{
printf("%lld\n",ans);
scanf("%d",&x);
ans-=Query(1,pst[x]-1,x+1,n);
ans-=Query(pst[x]+1,n,1,x-1);
Modify(pst[x],-1);
}
return 0;
}