Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
31989 | baka24 | 【S】T2 | C++ | 通过 | 100 | 268 MS | 29680 KB | 2336 | 2024-08-28 19:54:30 |
#include<bits/stdc++.h> using namespace std; #define int long long #define lson pos<<1 #define rson pos<<1|1 #define pii pair<int,int> #define fr first #define sc second int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=500010,Mod=998244353,inf=1000000000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} int n,q,a[MAXN],p[MAXN],ans; struct treearray{ int C[MAXN]; int lb(int x){return x&(-x);} void upd(int x,int y){for(int i=x;i<=n;i+=lb(i))C[i]+=y;} int qry(int x){int res=0;for(int i=x;i>=1;i-=lb(i))res+=C[i];return res;} }A; struct segtree{ pii t[MAXN<<2]; void pushup(int pos){ t[pos]=min(t[rson],t[lson]); } void build(int pos,int l,int r){ if(l==r){ t[pos]={a[l],l}; return; } int mid=(l+r)>>1; build(lson,l,mid);build(rson,mid+1,r); pushup(pos); } void update(int pos,int l,int r,int x){ if(l==r){ t[pos]={inf,inf}; return; } int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x); if(x>mid)update(rson,mid+1,r,x); pushup(pos); } pii query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){ return t[pos]; } int mid=(l+r)>>1;pii res={inf,inf}; if(ql<=mid)res=query(lson,l,mid,ql,qr); if(qr>mid)res=min(res,query(rson,mid+1,r,ql,qr)); return res; } }T; void slv(){ n=read(),q=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=n;i>=1;i--){ ans+=p[i]=A.qry(a[i]); A.upd(a[i],1); } T.build(1,1,n); while(q--){ int x=read(); if(a[x]==inf){ printf("%lld\n",ans); continue; } pii tmp=T.query(1,1,n,x,n); while(tmp.sc!=x){ ans-=p[tmp.sc]; a[tmp.sc]=inf; T.update(1,1,n,tmp.sc); tmp=T.query(1,1,n,x,n); } ans-=p[tmp.sc]; a[tmp.sc]=inf; T.update(1,1,n,tmp.sc); printf("%lld\n",ans); } } signed main(){ slv(); return 0; }