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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
# include<bits/stdc++.h>
using namespace std; const int maxn=60000+10; int a[maxn],hash[maxn]; int rt[maxn],RT[maxn],ls[maxn*32],rs[maxn*32],sum[maxn*32]; int ul[maxn],ur[maxn]; int tot,n,q,N; struct node{ int l,r,k; bool flag; }op[maxn]; int lowbit(int x){ return x&(-x); } void build(int& o,int l,int r){ o=++tot; sum[o]=0; if(l==r) return; int m=(l+r)/2; build(ls[o],l,m); build(rs[o],m+1,r); } void update(int& o,int l,int r,int last,int p,int val){ o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; sum[o]=sum[last]+val; if(l==r) return ; int m=(l+r)/2; if(p<=m) update(ls[o],l,m,ls[last],p,val); else update(rs[o],m+1,r,rs[last],p,val); } void add(int x,int val){ int res=lower_bound(hash+1,hash+N+1,a[x])-hash; while(x<=n){ update(RT[x],1,N,RT[x],res,val); x+=lowbit(x); } }
int Sum(int x,bool flag){ int res=0; while(x){ if(flag) res+=sum[ls[ur[x]]]; else res+=sum[ls[ul[x]]]; x-=lowbit(x); } return res; }
int query(int s,int e,int ts,int te,int l,int r,int k){ if(l==r) return l; int m=(l+r)/2; int cnt=Sum(e,true)-Sum(s,false)+sum[ls[te]]-sum[ls[ts]]; if(k<=cnt){ for(int i=e;i;i-=lowbit(i)) ur[i]=ls[ur[i]]; for(int i=s;i;i-=lowbit(i)) ul[i]=ls[ul[i]]; return query(s,e,ls[ts],ls[te],l,m,k); } else{ for(int i=e;i;i-=lowbit(i)) ur[i]=rs[ur[i]]; for(int i=s;i;i-=lowbit(i)) ul[i]=rs[ul[i]]; return query(s,e,rs[ts],rs[te],m+1,r,k-cnt); } } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d %d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); hash[i]=a[i]; } char str[2]; N=n; for(int i=1;i<=q;i++){ scanf("%s",str); if(str[0]=='Q'){ scanf("%d %d %d",&op[i].l,&op[i].r,&op[i].k); op[i].flag=true; } else{ scanf("%d %d",&op[i].r,&op[i].k); op[i].flag=false; hash[++N]=op[i].k; } } sort(hash+1,hash+N+1); N=unique(hash+1,hash+N+1)-(hash+1); tot=0; build(rt[0],1,N); for(int i=1;i<=n;i++) update(rt[i],1,N,rt[i-1],lower_bound(hash+1,hash+N+1,a[i])-hash,1); for(int i=1;i<=n;i++) RT[i]=rt[0]; for(int i=1;i<=q;i++){ int l=op[i].l,r=op[i].r,k=op[i].k; if(op[i].flag){ for(int j=r;j;j-=lowbit(j)) ur[j]=RT[j]; for(int j=l-1;j;j-=lowbit(j)) ul[j]=RT[j]; int res=query(l-1,r,rt[l-1],rt[r],1,N,k); printf("%dn",hash[res]); } else{ add(r,-1); a[r]=k; add(r,1); } } } return 0; }
|
近期评论