提交时间:2024-08-28 16:08:02
运行 ID: 31964
#include<bits/stdc++.h> #define int long long #define pii pair<int,int> #define mp make_pair using namespace std; const int maxn=1e6+7; int n,q; int p[maxn]; inline int lb(int x){ return x&(-x); } struct BIT1{ int t[maxn]; inline void clr(){ memset(t,0,sizeof(t)); } inline void add(int x,int dt){ while(x<=n){ t[x]+=dt; x+=lb(x); } } inline int qry(int x){ int ans=0; while(x){ ans=ans+t[x]; x-=lb(x); } return ans; } }T1; struct BIT2{ int t[maxn]; inline void clr(){ for(int i=1;i<=n;i++)t[i]=q+1; } inline void upd(int x,int c){ x=n-x+1; while(x<=n){ t[x]=min(t[x],c); x+=lb(x); } } inline int qry(int x){ x=n-x+1; int ans=q+1; while(x){ ans=min(ans,t[x]); x-=lb(x); } return ans; } }T2; int f[maxn]; int qq[maxn]; int Ti[maxn]; int Tk[maxn]; int de[maxn]; signed main(){ cin>>n>>q; for(int i=1;i<=n;i++)cin>>p[i]; int S=0; T1.clr(),T2.clr(); for(int i=1;i<=n;i++)Ti[i]=q+1; for(int i=n;i>=1;i--){ f[i]=T1.qry(p[i]),S+=f[i]; T1.add(p[i],1); } for(int i=1;i<=q;i++)cin>>qq[i],Ti[qq[i]]=min(Ti[qq[i]],i); for(int i=1;i<=n;i++){ // cout<<i<<" "; T2.upd(p[i],Ti[i]); // cout<<"U "; Tk[i]=min(Ti[i],T2.qry(i)); // cout<<"Q"<<endl; } for(int i=1;i<=n;i++)de[Tk[i]]+=f[i]; // cout<<endl; for(int i=1;i<=q;i++){ S-=de[i]; cout<<S<<endl; } }