提交时间:2024-08-28 19:26:24

运行 ID: 31973

#include<bits/stdc++.h> using namespace std; int n,Q,p[500010],nx[200010],val[200010]; pair<int,int> ans[500010<<4];//id,val int sum[501000<<4]; long long nowval; inline int ls(int x){return x<<1;} inline int rs(int x){return x<<1|1;} inline void update(int x){ if(ans[ls(x)].second<ans[rs(x)].second){ ans[x].second=ans[ls(x)].second; ans[x].first=ans[ls(x)].first; }else{ ans[x].second=ans[rs(x)].second; ans[x].first=ans[rs(x)].first; }sum[x]=sum[ls(x)]+sum[rs(x)]; }inline void build(int x,int l,int r){ //cout<<l<<' '<<r<<'\n'; if(l==r){ ans[x].first=l; ans[x].second=1e9; return; }int mid=(l+r)>>1; build(ls(x),l,mid); build(rs(x),mid+1,r); update(x); }inline void ins1(int x,int l,int r,int aiml,int aimr,int num){ if(aiml<=l&&r<=aimr){ ans[x].second=num; return; }int mid=(l+r)>>1; if(aiml<=mid) ins1(ls(x),l,mid,aiml,aimr,num); if(mid<aimr) ins1(rs(x),mid+1,r,aiml,aimr,num); update(x); }inline pair<int,int> getmin(int x,int l,int r,int aiml,int aimr){ //cout<<l<<' '<<r<<'\n'; if(aiml<=l&&r<=aimr){ return ans[x]; }int mid=(l+r)>>1;pair<int,int> nowmin;nowmin.second=1e9; if(aiml<=mid){ pair<int,int> nextmin=getmin(ls(x),l,mid,aiml,aimr); if(nextmin.second<nowmin.second){ nowmin=nextmin; } }if(mid<aimr){ pair<int,int> nextmin=getmin(rs(x),mid+1,r,aiml,aimr); if(nextmin.second<nowmin.second){ nowmin=nextmin; } }update(x); return nowmin; }inline void ins2(int x,int l,int r,int aiml,int aimr,int num){ if(aiml<=l&&r<=aimr){ sum[x]=num; return; }int mid=(l+r)>>1; if(aiml<=mid) ins2(ls(x),l,mid,aiml,aimr,num); if(mid<aimr) ins2(rs(x),mid+1,r,aiml,aimr,num); update(x); }inline int getsum(int x,int l,int r,int aiml,int aimr){ //cout<<l<<' '<<r<<'\n'; if(aiml<=l&&r<=aimr){ return sum[x]; }int mid=(l+r)>>1,nowsum=0; if(aiml<=mid) nowsum+=getsum(ls(x),l,mid,aiml,aimr); if(mid<aimr) nowsum+=getsum(rs(x),mid+1,r,aiml,aimr); update(x); return nowsum; }bool cmp(int a,int b){ return a<b; }int main(){ //freopen("code.in","r",stdin); //freopen("code.out","w",stdout); cin>>n>>Q; build(1,1,n); for(int i=1;i<=n;i++){ cin>>p[i]; }int nowans=0; //cout<<"Debug1\n"; for(int i=n;i>=1;i--){ val[i]=getsum(1,1,n,1,p[i]); ins2(1,1,n,p[i],p[i],1); ins1(1,1,n,i,i,p[i]); nowans+=val[i]; }while(Q--){ int x;cin>>x; //cout<<x<<'\n'; while(1){ pair<int,int> nowdel=getmin(1,1,n,x,n); //cout<<nowdel.first<<' '; ins1(1,1,n,nowdel.first,nowdel.first,1e9); nowans-=val[nowdel.first]; val[nowdel.first]=0; if(nowdel.first==x) break; if(nowdel.second==1e9) break; }cout<<nowans<<'\n'; } }