提交时间:2024-08-28 19:37:42
运行 ID: 31985
#pragma GCC optimize(3) #pragma GCC target("avx") #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #pragma GCC optimize("-fgcse") #pragma GCC optimize("-fgcse-lm") #pragma GCC optimize("-fipa-sra") #pragma GCC optimize("-ftree-pre") #pragma GCC optimize("-ftree-vrp") #pragma GCC optimize("-fpeephole2") #pragma GCC optimize("-ffast-math") #pragma GCC optimize("-fsched-spec") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("-falign-jumps") #pragma GCC optimize("-falign-loops") #pragma GCC optimize("-falign-labels") #pragma GCC optimize("-fdevirtualize") #pragma GCC optimize("-fcaller-saves") #pragma GCC optimize("-fcrossjumping") #pragma GCC optimize("-fthread-jumps") #pragma GCC optimize("-funroll-loops") #pragma GCC optimize("-fwhole-program") #pragma GCC optimize("-freorder-blocks") #pragma GCC optimize("-fschedule-insns") #pragma GCC optimize("inline-functions") #pragma GCC optimize("-ftree-tail-merge") #pragma GCC optimize("-fschedule-insns2") #pragma GCC optimize("-fstrict-aliasing") #pragma GCC optimize("-fstrict-overflow") #pragma GCC optimize("-falign-functions") #pragma GCC optimize("-fcse-skip-blocks") #pragma GCC optimize("-fcse-follow-jumps") #pragma GCC optimize("-fsched-interblock") #pragma GCC optimize("-fpartial-inlining") #pragma GCC optimize("no-stack-protector") #pragma GCC optimize("-freorder-functions") #pragma GCC optimize("-findirect-inlining") #pragma GCC optimize("-fhoist-adjacent-loads") #pragma GCC optimize("-frerun-cse-after-loop") #pragma GCC optimize("inline-small-functions") #pragma GCC optimize("-finline-small-functions") #pragma GCC optimize("-ftree-switch-conversion") #pragma GCC optimize("-foptimize-sibling-calls") #pragma GCC optimize("-fexpensive-optimizations") #pragma GCC optimize("-funsafe-loop-optimizations") #pragma GCC optimize("inline-functions-called-once") #pragma GCC optimize("-fdelete-null-pointer-checks") #pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; #define int long long int n,Q,p[500010],nx[500010],val[500010]; 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; }signed main(){ freopen("code.in","r",stdin); freopen("code.out","w",stdout); ios::sync_with_stdio(0); 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<<' '; if(nowdel.second==1e9||nowdel.second>p[x]) break; ins1(1,1,n,nowdel.first,nowdel.first,1e9); nowans-=val[nowdel.first]; val[nowdel.first]=0; if(nowdel.first==x) break; //if(nowdel.first==x) break; //if(nowdel.second==1e9) break; }cout<<nowans<<'\n'; } }