#include<cstdio>
#define mx(a,b) (a>b?a:b)
using namespace std;
struct node{
int l,r;
node*lc,*rc;
long long num;
}*gen;
long long inp[200005];
inline long long readl(void){
long long ans=0,x=1;
register char us=getchar();
while(us>'9'||us<'0'){
if(us=='-')x=-1;
us=getchar();
}
while(us>='0'&&us<='9'){
ans=(ans<<3)+(ans<<1)+(us^48);
us=getchar();
}
return ans*x;
}
inline int read(void){
register int ans=0,x=1;
register char us=getchar();
while(us<'0'||us>='9'){
if(us=='-')x=-1;
us=getchar();
}
while(us>='0'&&us<='9'){
ans=(ans<<1)+(ans<<3)+(us^48);
us=getchar();
}
return ans*x;
}
inline void build(node*nw,int l,int r){
nw->l=l;nw->r=r;
if(l==r){
nw->num=inp[l];
nw->lc=nw->rc=NULL;
}
else{
nw->lc=new node;
nw->rc=new node;
build(nw->lc,l,l+r>>1);
build(nw->rc,(l+r>>1)+1,r);
nw->num=mx(nw->lc->num,nw->rc->num);
}
return;
}
inline void change(node*nw,int x,int n){
if(nw->l==x&&nw->r==x&&nw->num<n)nw->num=n;
if(nw->rc==NULL)return;
if(x<=nw->l+nw->r>>1)change(nw->lc,x,n);
else change(nw->rc,x,n);
nw->num=mx(nw->lc->num,nw->rc->num);
return;
}
inline long long ask(node*nw,int l,int r){
if(nw->l>=l&&nw->r<=r)return nw->num;
long long ans=0;
if(nw->l+nw->r>>1>=l)ans=mx(ans,ask(nw->lc,l,r));
if(nw->l+nw->r>>1<r)ans=mx(ans,ask(nw->rc,l,r));
return ans;
}
int main(){
int n,m;
gen=new node;
n=read();m=read();
register int i;
long long l,r;
for(i=1;i<=n;++i)inp[i]=readl();
build(gen,1,n);
register char c;
for(i=0;i<m;++i){
scanf("%c",&c);l=readl();r=readl();
if(c=='Q')printf("%lld\n",ask(gen,l,r));
if(c=='U')change(gen,l,r);
}
return 0;
}