1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 using namespace std;
6 const int maxn=2200001;
7 int N,M,tot,top,siz;
8 int v[10001],num[20001],hash[20001];
9 int flag[10001],A[10001],B[10001],K[10001],root[10001];
10 int sum[maxn],ls[maxn],rs[maxn];
11 int L[30],R[30],a,b;//L[] R[]存储端点集合
12 inline int lowbit(int x){
13 return x&(-x);
14 }
15 int find(int x){
16 int l=1,r=tot;
17 while(l<=r){
18 int mid=(l+r)>>1;
19 if(hash[mid]<x) l=mid+1;
20 else r=mid-1;
21 }
22 return l;
23 }
24 void update(int last,int l,int r,int &rt,int w,int x){
25 rt=++siz;//添加一个新节点
26 sum[rt]=sum[last]+x;
27 ls[rt]=ls[last]; rs[rt]=rs[last];//覆盖原有的节点
28 if(l==r) return ;
29 int mid=(l+r)>>1;
30 if(w<=mid) update(ls[last],l,mid,ls[rt],w,x);
31 else update(rs[last],mid+1,r,rs[rt],w,x);
32 }
33 int query(int l,int r,int k){
34 if(l==r) return l;
35 int suml=0,sumr=0;
36 for(int i=1;i<=a;i++) suml+=sum[ls[L[i]]];//根为 L[i]的线段树区间为(1,mid) 的sum值
37 for(int i=1;i<=b;i++) sumr+=sum[ls[R[i]]];
38 int mid=(l+r)>>1;
39 if(sumr-suml>=k){//说明答案 在1~mid里
40 for(int i=1;i<=a;i++) L[i]=ls[L[i]];
41 for(int i=1;i<=b;i++) R[i]=ls[R[i]];
42 return query(l,mid,k);
43 }
44 else{
45 for(int i=1;i<=a;i++) L[i]=rs[L[i]];
46 for(int i=1;i<=b;i++) R[i]=rs[R[i]];
47 return query(mid+1,r,k-(sumr-suml));
48 }
49 }
50 int main(){
51 char s[3];
52 scanf("%d%d",&N,&M);
53
54 for(int i=1;i<=N;i++){
55 scanf("%d",&v[i]);
56 num[++top]=v[i];
57 }
58 for(int i=1;i<=M;i++){
59 scanf("%s%d%d",s,&A[i],&B[i]);
60 if(s[0]=='Q'){
61 scanf("%d",&K[i]); flag[i]=1;
62 }
63 else num[++top]=B[i];//把初始值和修改值放在一起,方便知道线段树的大小
64 }
65 sort(num+1,num+top+1);
66 hash[++tot]=num[1];
67 for(int i=2;i<=top;i++){//去重
68 if(num[i]!=num[i-1]) hash[++tot]=num[i];
69 }
70 for(int i=1;i<=N;i++){
71 int t=find(v[i]);//找到v[i]的位置,相当于离散化
72 for(int j=i;j<=N;j+=lowbit(j)){//树状数组更新
73 update(root[j],1,tot,root[j],t,1);
74 }
75 }
76
77 for(int i=1;i<=M;i++){
78 if(flag[i]==1){//询问
79 a=0; b=0; A[i]--;
80 for(int j=A[i];j>0;j-=lowbit(j))
81 L[++a]=root[j];
82 for(int j=B[i];j>0;j-=lowbit(j))
83 R[++b]=root[j];
84 printf("%d\n",hash[query(1,tot,K[i])]);
85 }
86 else{//修改
87 int t=find(v[A[i]]);
88 for(int j=A[i];j<=N;j+=lowbit(j))//删除原有影响
89 update(root[j],1,tot,root[j],t,-1);
90 v[A[i]]=B[i];//更改
91 t=find(B[i]);
92 for(int j=A[i];j<=N;j+=lowbit(j))
93 update(root[j],1,tot,root[j],t,1);
94 }
95 }
96 return 0;
97 }