1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include<bits/stdc++.h> #define lowbit(x) (x&(-x)) #define mid ((l+r)>>1) using namespace std; const int maxn=1e5+10; struct node{int lc,rc,siz;}T[maxn*600]; struct qury{int a,b,c;}q[maxn]; char op[10]; int n,m,ansx,ansy,tot,len; int root[maxn*600],a[maxn],b[maxn<<1],qx[maxn],qy[maxn]; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*f; } inline void update(int &root,int pre,int l,int r,int val,int num){ T[root=++tot]=T[pre],T[root].siz+=num; if(l==r) return; if(val<=mid) update(T[root].lc,T[pre].lc,l,mid,val,num); else update(T[root].rc,T[pre].rc,mid+1,r,val,num); } inline void add(int pos,int v){ int val=lower_bound(b+1,b+len+1,a[pos])-b; for(int i=pos;i<=n;i+=lowbit(i)) update(root[i],root[i],1,len,val,v); } inline int query(int l,int r,int k,int sum=0){ if(l==r) return l; for(int i=1;i<=ansx;++i) sum-=T[T[qx[i]].lc].siz; for(int i=1;i<=ansy;++i) sum+=T[T[qy[i]].lc].siz; if(k<=sum){ for(int i=1;i<=ansx;++i) qx[i]=T[qx[i]].lc; for(int i=1;i<=ansy;++i) qy[i]=T[qy[i]].lc; return query(l,mid,k); } else{ for(int i=1;i<=ansx;++i) qx[i]=T[qx[i]].rc; for(int i=1;i<=ansy;++i) qy[i]=T[qy[i]].rc; return query(mid+1,r,k-sum); } } inline void disc(){ sort(b+1,b+len+1); len=unique(b+1,b+len+1)-b-1; } inline void print(int x){ if(x>9) print(x/10); putchar(x%10+'0'); } int main(){ n=read(),m=read(); for(int i=1;i<=n;++i) a[i]=b[++len]=read(); for(int i=1;i<=m;++i){ scanf("%s",op); q[i].a=read(),q[i].b=read(); if(op[0]=='Q') q[i].c=read(); if(op[0]=='C') q[i].c=0,b[++len]=q[i].b; }disc(); for(int i=1;i<=n;++i) add(i,1); for(int i=1;i<=m;++i){ if(q[i].c){ ansx=0,ansy=0; for(int j=q[i].b;j;j-=lowbit(j)) qy[++ansy]=root[j]; for(int j=q[i].a-1;j;j-=lowbit(j)) qx[++ansx]=root[j]; print(b[query(1,len,q[i].c)]),putchar(10); } else{ add(q[i].a,-1),a[q[i].a]=q[i].b; add(q[i].a,1); } } }
|