维护一个sum数组,有点划分树的思想,写过划分树的应该能看出来
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace std; const int maxn=500005; int sum[maxn<<2],is[maxn]; void pushup(int rt) { sum[rt]=sum[rt*2]+sum[rt*2+1]; } void build(int rt,int l,int r) { if(l==r) { is[l]=sum[rt]=1; return; } int m=(l+r)>>1; build(rt*2,l,m); build(rt*2+1,m+1,r); pushup(rt); } void change(int rt,int l,int r,int pos,int c) { if(l==r) { sum[rt]=c; return; } int m=(l+r)>>1; if(pos<=m)change(rt*2,l,m,pos,c); else change(rt*2+1,m+1,r,pos,c); pushup(rt); } int query(int rt,int l,int r,int k) { if(l==r) { return l; } int m=(l+r)>>1; if(sum[rt*2]>=k)return query(rt*2,l,m,k); else return query(rt*2+1,m+1,r,k-sum[rt*2]); } int main() { int n,m; scanf("%d%d",&n,&m); build(1,1,n); for(int i=0;i<m;++i) { char s[5]; int k; scanf("%s%d",s,&k); if(s[0]=='L') { int x=query(1,1,n,k); is[x]=0; change(1,1,n,x,0); } else if(s[0]=='R') { if(is[k]==1)continue; is[k]=1; change(1,1,n,k,1); } else { int x=query(1,1,n,k); printf("%d ",x); } } return 0; }