1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<cmath>
5 #include<iostream>
6 #include<algorithm>
7 using namespace std;
8
9 const int N=10010,INF=(int)1e9+100;
10 int n,m,pl,tl,mx;
11 int a[2*N],num[2*N],crt[2*N],root[2*N];
12 char s[10];
13 struct trnode{
14 int lc,rc,cnt;
15 }t[300*N];
16 struct ques{
17 int l,r,k,x,d;
18 bool tmp;
19 }q[N];
20 struct node{
21 int d,id;
22 }p[2*N];
23
24 bool cmp(node x,node y){return x.d<y.d;}
25
26 int bt(int l,int r)
27 {
28 int x=++tl;
29 t[x].cnt=0;
30 t[x].lc=t[x].rc=0;
31 if(l<r)
32 {
33 int mid=(l+r)/2;
34 t[x].lc=bt(l,mid);
35 t[x].rc=bt(mid+1,r);
36 }
37 return x;
38 }
39
40 int update(int rt,int p,int d)
41 {
42 int now=++tl,tmp=now;
43 int l=1,r=mx,mid;
44 t[now].cnt=t[rt].cnt+d;
45 while(l<r)
46 {
47 mid=(l+r)/2;
48 if(p<=mid)
49 {
50 r=mid;
51 t[now].lc=++tl;
52 t[now].rc=t[rt].rc;
53 rt=t[rt].lc;
54 now=tl;
55 }
56 else
57 {
58 l=mid+1;
59 t[now].lc=t[rt].lc;
60 t[now].rc=++tl;
61 rt=t[rt].rc;
62 now=tl;
63 }
64 t[now].cnt=t[rt].cnt+d;
65 }
66 return tmp;
67 }
68
69 void add(int x,int p,int d)
70 {
71 for(int i=x;i<=n;i+=(i&(-i))) root[i]=update(root[i],p,d);
72 }
73
74 int getsum(int x)
75 {
76 int ans=0;
77 for(int i=x;i>=1;i-=(i&(-i))) ans+=t[t[crt[i]].lc].cnt;
78 return ans;
79 }
80
81 int query(int lx,int rx,int k)
82 {
83 for(int i=lx-1;i>=1;i-=(i&(-i))) crt[i]=root[i];//多棵树同时走。
84 for(int i=rx;i>=1;i-=(i&(-i))) crt[i]=root[i];
85 int l=1,r=mx,mid,sum;
86 while(l<r)
87 {
88 mid=(l+r)/2;
89 sum=getsum(rx)-getsum(lx-1);
90 if(sum>=k)
91 {
92 r=mid;
93 for(int i=lx-1;i>=1;i-=(i&(-i))) crt[i]=t[crt[i]].lc;
94 for(int i=rx;i>=1;i-=(i&(-i))) crt[i]=t[crt[i]].lc;
95 }
96 else
97 {
98 l=mid+1;
99 k-=sum;
100 for(int i=lx-1;i>=1;i-=(i&(-i))) crt[i]=t[crt[i]].rc;
101 for(int i=rx;i>=1;i-=(i&(-i))) crt[i]=t[crt[i]].rc;
102 }
103 }
104 return l;
105 }
106
107 int main()
108 {
109 freopen("a.in","r",stdin);
110 scanf("%d%d",&n,&m);
111 pl=n;tl=0;
112 for(int i=1;i<=n;i++)
113 {
114 scanf("%d",&a[i]);
115 p[i].d=a[i];p[i].id=i;
116 }
117 for(int i=1;i<=m;i++)
118 {
119 scanf("%s",s);
120 if(s[0]==‘Q‘)
121 {
122 q[i].tmp=0;
123 scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
124 }
125 else
126 {
127 q[i].tmp=1;
128 scanf("%d%d",&q[i].x,&q[i].d);
129 p[++pl].d=q[i].d;p[pl].id=n+i;
130 }
131 }
132 sort(p+1,p+1+pl,cmp);
133 mx=0;p[0].d=INF;
134 for(int i=1;i<=pl;i++)
135 {
136 if(p[i].d!=p[i-1].d) mx++,num[mx]=p[i].d;
137 if(p[i].id<=n) a[p[i].id]=mx;
138 else q[p[i].id-n].d=mx;
139 }
140 // for(int i=1;i<=n;i++) printf("%d ",a[i]);printf("\n");
141 root[0]=bt(1,mx);
142 for(int i=1;i<=n;i++)
143 root[i]=root[0];
144 for(int i=1;i<=n;i++)
145 add(i,a[i],1);
146 for(int i=1;i<=m;i++)
147 {
148 if(q[i].tmp==0)
149 printf("%d\n",num[query(q[i].l,q[i].r,q[i].k)]);
150 else
151 {
152 add(q[i].x,a[q[i].x],-1);
153 add(q[i].x,q[i].d,1);
154 a[q[i].x]=q[i].d;//debug
155 }
156 }
157 return 0;
158 }