#include<bits/stdc++.h>
#define int long long
using namespace std;
char ic(){
char Ch_=getchar();
while(Ch_==' '||Ch_=='\n')
Ch_=getchar();
return Ch_;
}
const int N=2e5+5;
int n,q,a[N];
struct line{
int l,r,max,id,now;
};
line tree[N*4];
void build(int k,int l,int r){
tree[k].l=l;tree[k].r=r;
if(l==r){
tree[k].max=a[l];
return;
}
int mid=l+r>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
tree[k].max=max(tree[2*k].max,tree[2*k+1].max);
}
void pushdown(int k){
if(tree[k].now){
if(tree[2*k].l<=tree[k].id&&tree[2*k].r>=tree[k].id){
tree[2*k].id=tree[k].id;
tree[2*k].now=tree[k].now;
}else{
tree[2*k+1].id=tree[k].id;
tree[2*k+1].now=tree[k].now;
}
}
tree[k].id=0;
tree[k].now=0;
}
void change(int k,int id,int now){
if(tree[k].l==tree[k].r){
tree[k].max=now;
return;
}
pushdown(k);
int mid=tree[k].l+tree[k].r>>1;
if(id<=mid) change(2*k,id,now);
else change(2*k+1,id,now);
tree[k].max=max(tree[2*k].max,tree[2*k+1].max);
}
int ask(int k,int L,int R){
if(tree[k].l>=L&&tree[k].r<=R)
return tree[k].max;
pushdown(k);
int mid=tree[k].l+tree[k].r>>1,ans=0;
if(L<=mid) ans=max(ans,ask(2*k,L,R));
if(R>mid) ans=max(ans,ask(2*k+1,L,R));
return ans;
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(q--){
char opt;
cin>>opt;
if(opt=='Q'){
int l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",ask(1,l,r));
}else{
int id,now;
scanf("%lld%lld",&id,&now);
change(1,id,now);
}
}
return 0;
}