#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
#define Red(i,r,L) for(register int i=(r);i>=(L);--i)
const int N = 1e4+10,Maxsiz = N*log2(N)*2;
int n,m,a[N];
struct Splay
{
int p[Maxsiz],ch[Maxsiz][2];
int cnt,k[Maxsiz],siz[Maxsiz];
#define Ls(v) ch[v][0]
#define rs(v) ch[v][1]
#define sum(v) siz[v]=siz[Ls(v)]+siz[rs(v)]+1
inline void rotate(int x)
{
int f=p[x],gf=p[f],tp=rs(f)==x,son=ch[x][!tp];
ch[p[son]=f][tp]=son,sum(f);
ch[p[f]=x][!tp]=f,sum(x);
ch[p[x]=gf][rs(gf)==f]=x;
}
inline void splay(int x,int &rt)
{
while(p[x])
{
if((p[p[x]])&&((rs(p[p[x]])==p[x])==(rs(p[x])==x)))
rotate(p[x]);
rotate(x);
}
rt=x;
}
inline void newnode(int x,int v,int Fa)
{
siz[x]=1;
p[x]=Fa;
k[x]=v;
}
inline void insert(int &x,int v,int Fa,int &root)
{
if(!x)
return newnode(x=++cnt,v,Fa),splay(x,root),void();
insert(ch[x][k[x]<v],v,x,root);
}
inline int Query(int x,int v)
{
int tot=0;
while(x)
k[x]<=v?tot+=siz[Ls(x)]+1,x=rs(x):x=Ls(x);
return tot;
}
inline int findpre(int x)
{
for(x=Ls(x); rs(x); x=rs(x));
return x;
}
inline int findsub(int x)
{
for(x=rs(x); Ls(x); x=Ls(x));
return x;
}
inline void delet(int x,int v,int &root)
{
for(; k[x]^v; x=ch[x][k[x]<v]);
splay(x,root);
if(!Ls(x))
return p[root=rs(x)]=0,void();
int pre=findpre(x);
splay(pre,root);
rs(pre)=rs(x);
if(rs(x))
p[rs(x)]=pre;
sum(pre);
}
} sp;
struct SegMent
{
struct tree
{
int L,r,rt;
} t[N<<2];
#define Lc v<<1
#define rc v<<1|1
inline void Modify(int v,int x,bool cmd)
{
if(t[v].L>x||t[v].r<x)
return ;
cmd?sp.insert(t[v].rt,a[x],0,t[v].rt):sp.delet(t[v].rt,a[x],t[v].rt);
if(t[v].L==t[v].r)
return ;
Modify(Lc,x,cmd),Modify(rc,x,cmd);
}
inline int Query(int v,int A,int b,int k)
{
if(t[v].L>b||t[v].r<A)
return 0;
if(A<=t[v].L&&t[v].r<=b)
return sp.Query(t[v].rt,k);
return Query(Lc,A,b,k)+Query(rc,A,b,k);
}
inline void build(int v,int L,int r)
{
t[v]=(tree)
{
L,r
};
Inc(i,L,r)sp.insert(t[v].rt,a[i],0,t[v].rt);
if(L==r)
return ;
int Mid=L+r>>1;
build(Lc,L,Mid),build(rc,Mid+1,r);
}
} tr;
inline void Modify()
{
int x,k;
scanf("%d%d",&x,&k);
tr.Modify(1,x,0);
a[x]=k;
tr.Modify(1,x,1);
}
inline void Query()
{
int ans,aa,bb;
scanf("%d%d",&aa,&bb);
if(aa-1<y)
{
cout<<0<<endl;
return ;
}
int minn=a[bb];
int maxx=-1;
for(int x=tr.t[1].rt; x;)
{
int tmp=tr.Query(1,1,n,sp.k[x]);
if(tmp<aa-1)
x=sp.rs(x);
else
ans=sp.k[x],x=sp.Ls(x);
}
cout<<min(minn,ans)<<"\n";
}
int main()
{
scanf("%d%d",&n,&m);
Inc(i,1,n)scanf("%d",&a[i]);
tr.build(1,1,n);
Inc(i,1,m)
{
char c=getchar();
while((c^'Q')&&(c^'C'))
c=getchar();
c=='Q'?Query():Modify();
}
return 0;
}