SB题去死吧
#include <bits/stdc++.h>
#define ll int
#define rll register ll
#define cll const ll
#define N 100005
#define M 25
using namespace std;
inline ll read()
{
rll x=0;bool f=1;register char c=getchar();
while(c<48||c>57){if(c=='-') f=0;c=getchar();}
while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
return f?x:-x;
}
inline void write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
cll n=read();
ll m=read(),cl,cr,ans,idt=1,a[N],rt[N],pl[M],pr[M],tpl[M],tpr[M],pos[N];
struct node{ll ls,rs,cnt;}t[N*400];
inline void build(ll p,ll l,ll r)
{
if(l==r) return;
t[p].ls=++idt,t[p].rs=++idt;
rll mid=l+r>>1;
build(t[p].ls,l,mid);
build(t[p].rs,mid+1,r);
}
inline ll change(ll p,ll l,ll r,ll x,ll k)
{
rll q=++idt;
t[q]=t[p],t[q].cnt+=k;
if(l==r) return q;
rll mid=l+r>>1;
if(x<=mid) t[q].ls=change(t[p].ls,l,mid,x,k);
else t[q].rs=change(t[p].rs,mid+1,r,x,k);
return q;
}
inline ll query(ll l,ll r,ll ql,ll qr)
{
rll cnt=0;
if(l>=ql&&r<=qr)
{
for(rll i=1;i<=cr;i++) cnt+=t[pr[i]].cnt;
for(rll i=1;i<=cl;i++) cnt-=t[pl[i]].cnt;
// cout << "sb[" << l << ',' << r << "]=" << cnt << '\n';
// if(l==4&&r==4)
// {
// cout << "\n\n\n";
// cout << "cnt4:";
// for(rll i=1;i<=cr;i++) cout << pr[i] << ' ';
// cout << "\n\n\n";
// }
return cnt;
}
rll mid=l+r>>1,ret=0;
memcpy(tpl,pl,sizeof tpl);
memcpy(tpr,pr,sizeof tpr);
if(ql<=mid)
{
for(rll i=1;i<=cl;i++) pl[i]=t[pl[i]].ls;
for(rll i=1;i<=cr;i++) pr[i]=t[pr[i]].ls;
ret+=query(l,mid,ql,qr);
}
memcpy(pl,tpl,sizeof pl);
memcpy(pr,tpr,sizeof pr);
if(mid<qr)
{
for(rll i=1;i<=cl;i++) pl[i]=t[pl[i]].rs;
for(rll i=1;i<=cr;i++) pr[i]=t[pr[i]].rs;
ret+=query(mid+1,r,ql,qr);
}
return ret;
}
inline void getrt(ll x,ll y)
{
cl=cr=0,x--;
while(x)
{
pl[++cl]=rt[x];
x-=(x&-x);
}
while(y)
{
pr[++cr]=rt[y];
y-=(y&-y);
}
}
inline void changert(ll x,ll v,ll k)
{
while(x<=n)
{
if(!rt[x]) rt[x]=1;
rt[x]=change(rt[x],1,n,v,k);
//cout << "change(" << v << ',' << k << ")\n";
// if(v==4) cout << "SBSBSBSBSBSBSBSBSBSB=" << rt[x] << '\n';
x+=(x&-x);
}
}
int main()
{
rt[0]=1,build(1,1,n);
for(rll i=1;i<=n;i++)
{
a[i]=read(),pos[a[i]]=i;
// cout << "SB:";
if(i>1&&a[i]>1)
{
getrt(1,i-1);
ans+=i-1-query(1,n,1,a[i]-1);
// getrt(1,i-1);
// cout << i-1-query(1,n,1,a[i]-1) << '\n';
}
// else cout << "0\n";
changert(i,a[i],1);
}
while(m--)
{
cll x=read();
// cout << "\n\n\n";
// getrt(4,4);
// cout << "cnt[4]=" << query(1,n,4,4) << '\n';
// cout << "\n\n\n";
write(ans),putchar('\n');
// cout << "sb:";
if(pos[x]>1&&x<n)
{
getrt(1,pos[x]-1);
// for(rll i=1;i<=cl;i++) cout << "pl[" << i << "]=" << pl[i] << '\n';
// for(rll i=1;i<=cr;i++) cout << "pr[" << i << "]=" << pr[i] << '\n';
ans-=query(1,n,x+1,n);
getrt(1,pos[x]-1);
// cout << query(1,n,x+1,n) << ' ';
}
// else cout << "0 ";
if(pos[x]<n&&x>1)
{
getrt(pos[x]+1,n);
ans-=query(1,n,1,x-1);
getrt(pos[x]+1,n);
// cout << query(1,n,1,x-1) << '\n';
}
// else cout << "0\n";
changert(pos[x],x,-1);
}
return 0;
}