const int MAXN=1e5+5,Inf=1e9;
struct OPT{
int type,x,y,k,id;
}opt[MAXN<<2],temp1[MAXN<<2],temp2[MAXN<<2];
int n,a[MAXN],c[MAXN],ans[MAXN];
#define lowbit(x) ((x)&(-x))
void add(int pos,int v){
while(pos<=n){
c[pos]+=v;
pos+=lowbit(pos);
}
}
int query(int pos){
int ans=0;
while(pos){
ans+=c[pos];
pos-=lowbit(pos);
}
return ans;
}
void solver(int ql,int qr,int vl,int vr){
if(ql>qr)return;
int vm=vl+vr>>1;
if(vl==vr){
_rep(i,ql,qr) if(opt[i].type==1)
ans[opt[i].id]=vm;
return;
}
int cnt1=0,cnt2=0,pos=ql;
_rep(i,ql,qr){
if(opt[i].type==0){
if(opt[i].y<=vm){
add(opt[i].x,opt[i].k);
temp1[++cnt1]=opt[i];
}
else
temp2[++cnt2]=opt[i];
}
else{
int cnt=query(opt[i].y)-query(opt[i].x-1);
if(opt[i].k<=cnt)
temp1[++cnt1]=opt[i];
else{
temp2[++cnt2]=opt[i];
temp2[cnt2].k-=cnt;
}
}
}
_rep(i,1,cnt1){
if(temp1[i].type==0)add(temp1[i].x,-temp1[i].k);
opt[pos++]=temp1[i];
}
_rep(i,1,cnt2)opt[pos++]=temp2[i];
solver(ql,qr-cnt2,vl,vm);solver(ql+cnt1,qr,vm+1,vr);
}
int main()
{
n=read_int();
int m=read_int(),opt_cnt=0,q_cnt=0,x,y;
_rep(i,1,n){
a[i]=read_int();
opt[++opt_cnt]=OPT{0,i,a[i],1,0};
}
_rep(i,1,m){
char c=get_char();x=read_int(),y=read_int();
if(c=='C'){
opt[++opt_cnt]=OPT{0,x,a[x],-1,0};
opt[++opt_cnt]=OPT{0,x,a[x]=y,1,0};
}
else
opt[++opt_cnt]=OPT{1,x,y,read_int(),++q_cnt};
}
solver(1,opt_cnt,0,Inf);
_rep(i,1,q_cnt)
enter(ans[i]);
return 0;
}