疯了,交了6发WA
完全粘的动态逆序对的,加了多组数据的修改
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cerr<<#x<<' '<<x<<endl
#ifndef ONLINE_JUDGE
#define pia getchar
#else
#define pia nc
#endif
char nc(){
static char buf[1<<25],*p=buf,*q=buf;
if(p==q&&(q=(p=buf)+fread(buf,1,1<<25,stdin),p==q))return EOF;
return *p++;
}
template<class T>void read(T&x){
short f=1;x=0;
char ch=pia();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=pia();
}while(isdigit(ch)){
x=(x<<1)+(x<<3)+(ch^48);
ch=pia();
}x*=f;
}
template<class T>void write(T x){
if(x<0)putchar('-'),x=-x;
if(x>=10)write(x/10);
putchar(x%10+48);
}
#define int long long
#define maxn 200010
int n,m;
int lc[maxn*433],rc[maxn*433],rt[maxn],t[maxn*433],tot;
int pos[maxn],x;
void change(int&x,int l,int r,int pos,int k){
if(!x)x=++tot;
t[x]+=k;
if(l==r)return;
int mid=(l+r)>>1;
if(pos<=mid)change(lc[x],l,mid,pos,k);
else change(rc[x],mid+1,r,pos,k);
}
int ans;
int qa[maxn],qb[maxn],ca,cb;
int ask(int l,int r,int x,int on){
ca=cb=0;
for(int i=r;i;i-=i&-i)qa[++ca]=rt[i];
for(int i=l-1;i;i-=i&-i)qb[++cb]=rt[i];
l=1,r=n;
int res=0;
while(l<r){
int mid=(l+r)>>1;
if(x>mid){
if(on){
for(int i=1;i<=ca;i++)res+=t[lc[qa[i]]];
for(int i=1;i<=cb;i++)res-=t[lc[qb[i]]];
}
for(int i=1;i<=ca;i++)qa[i]=rc[qa[i]];
for(int i=1;i<=cb;i++)qb[i]=rc[qb[i]];
l=mid+1;
}else{
if(!on){
for(int i=1;i<=ca;i++)res+=t[rc[qa[i]]];
for(int i=1;i<=cb;i++)res-=t[rc[qb[i]]];
}
for(int i=1;i<=ca;i++)qa[i]=lc[qa[i]];
for(int i=1;i<=cb;i++)qb[i]=lc[qb[i]];
r=mid;
}
}
return res;
}
signed main(){
while(~scanf("%lld %lld",&n,&m)){
for(int i=1;i<=n;i++){
read(x);pos[x]=i;
ans+=ask(1,i-1,x,0);
for(int j=i;j<=n;j+=j&-j)change(rt[j],1,n,x,1);
}
while(m--){
write(ans),putchar('\n');
read(x);
ans-=ask(1,pos[x]-1,x,0);
ans-=ask(pos[x]+1,n,x,1);
for(int j=pos[x];j<=n;j+=j&-j)change(rt[j],1,n,x,-1);
}
memset(rt,0,sizeof rt);
for(int i=0;i<=tot;i++)lc[i]=rc[i]=t[i]=0;
tot=ans=0;
}
}