#include<stdio.h>
#include<ctype.h>
#include<algorithm>
#define lowbit(x) (x&-x)
#define N 10005
using namespace std;
int n,m,a[N],b[N*2],s[N][3],len;
char c;
int rt[N],val[N*400],lch[N*400],rch[N*400],cnt;
int L[20],R[20],llen,rlen;
void update(int &u,int l,int r,int k,int v) {
if(!u) u=++cnt;
val[u]+=v;
if(l<r) {
int mid=l+r>>1;
if(k<=mid) update(lch[u],l,mid,k,v);
else update(rch[u],mid+1,r,k,v);
}
}
void Update(int x,int v) {
int k=lower_bound(b+1,b+1+len,a[x])-b;
for(; x<=n; x+=lowbit(x)) update(rt[x],1,len,k,v);
}
int query(int l,int r,int k) {
if(l==r) return l;
int mid=l+r>>1, tmp=0;
for(int i=0; i<rlen; i++) tmp+=val[lch[R[i]]];
for(int i=0; i<llen; i++) tmp-=val[lch[L[i]]];
if(k<=tmp) {
for(int i=0; i<rlen; i++) R[i]=lch[R[i]];
for(int i=0; i<llen; i++) L[i]=lch[L[i]];
return query(l,mid,k);
} else {
for(int i=0; i<rlen; i++) R[i]=rch[R[i]];
for(int i=0; i<llen; i++) L[i]=rch[L[i]];
return query(mid+1,r,k-tmp);
}
}
int Query(int l,int r,int k) {
llen=0, rlen=0;
for(int i=r; i; i-=lowbit(i)) R[rlen++]=rt[i];
for(int i=l-1; i; i-=lowbit(i)) L[llen++]=rt[i];
return query(1,len,k);
}
int main() {
scanf("%d%d",&n,&m);
len=n;
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
b[i]=a[i];
}
for(int i=1; i<=m; i++) {
while(isspace(c=getchar()));
scanf("%d%d",&s[i][0],&s[i][1]);
if(c=='Q') scanf("%d",&s[i][2]);
else b[++len]=s[i][1], s[i][2]=-1;
}
sort(b+1,b+1+len);
len=unique(b+1,b+1+len)-b-1;
for(int i=1; i<=n; i++) Update(i,1);
for(int i=1; i<=m; i++) {
if(~s[i][2]) {
printf("%d\n",b[Query(s[i][0],s[i][1],s[i][2])]);
} else {
Update(s[i][0],-1);
a[s[i][0]]=s[i][1];
Update(s[i][0],1);
}
}
}
洛谷P2617 Dynamic Ranking 树状数组套主席树
最新推荐文章于 2021-08-31 21:04:29 发布