提交时间:2024-08-28 14:49:31

运行 ID: 31949

#include<bits/stdc++.h> #define int long long using namespace std; int n,q,a[500005]; int s[2000006],nx[2000006],lz[2000006]; #define ls (p<<1) #define rs (p<<1|1) #define mid (l+r>>1) void pu(int p){ s[p]=s[ls]+s[rs]; nx[p]=nx[ls]+nx[rs]; } void pd(int p){ lz[ls]+=lz[p]; lz[rs]+=lz[p]; nx[ls]+=lz[p]; nx[rs]+=lz[p]; if(!s[ls])nx[ls]=0; if(!s[rs])nx[rs]=0; lz[p]=0; } void upd(int l,int r,int id,int p){ if(l==r){ s[p]++; // cout<<p<<" "<<s[p]<<endl; return; } pd(p); if(id<=mid)upd(l,mid,id,ls); else upd(mid+1,r,id,rs); pu(p); return; } void upd1(int l,int r,int ml,int mr,int p){ if(ml>mr)return; if(ml<=l&&r<=mr){ lz[p]++; nx[p]++; return; } pd(p); if(ml<=mid)upd1(l,mid,ml,mr,ls); if(mr>=mid+1)upd1(mid+1,r,ml,mr,rs); pu(p); return; }void upd2(int l,int r,int id,int p){ if(l==r){ nx[p]=0; return; } pd(p); if(id<=mid)upd2(l,mid,id,ls); if(id>=mid+1)upd2(mid+1,r,id,rs); pu(p); return; } int qu(int l,int r,int id,int p){ if(l==r){ return nx[p]; } pd(p); int res=0; if(id<=mid)return qu(l,mid,id,ls); else return qu(mid+1,r,id,rs); } int qur(int l,int r,int ml,int mr,int p){ if(ml<=l&&r<=mr){ // cout<<p<<" "; return s[p]; } pd(p); int res=0; if(ml<=mid)res+=qur(l,mid,ml,mr,ls); if(mr>=mid+1)res+=qur(mid+1,r,ml,mr,rs); return res; } void print(){ for(int i=1;i<=n;i++) cout<<qur(1,n,i,i,1)<<" "; cout<<endl; } set<int>se; signed main(){ //freopen("pair.in","r",stdin); //freopen("pair.out","w",stdout); cin>>n>>q; int ans=0; for(int i=1;i<=n;i++){ se.insert(i); cin>>a[i]; ans+=qur(1,n,a[i]+1,n,1); // cout<<ans<<" "; // print(); upd(1,n,a[i],1); upd1(1,n,a[i]+1,n,1); } int lst=n; // cout<<ans<<" "; while(q--){ int x; cin>>x; auto it=se.begin(); while((it=se.lower_bound(x))!=se.end()){ int k=*it; se.erase(it); if(a[k]>a[x])continue; ans-=qu(1,n,a[k],1); // cout<<ans<<" "<<qu(1,n,a[k],1)<<" "<<a[k]<<endl;; upd2(1,n,a[k],1); } cout<<ans<<endl; } return 0; }