#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const long long MAXN=2000010;
int n,m,a[MAXN],w[10*MAXN];
void build(int x,int l,int r){
if(l==r){
w[x]=a[l];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
w[x]=max(w[x*2],w[x*2+1]);
}
int ans=-1e9;
int query(int x,int l,int r,int L,int R){
if(l>R||r<L) return -1;
if(l==r) return a[l];
if(L<=l&&r<=R){
return w[x];
}
else{
int mid=(l+r)/2;
ans=max(ans,max(query(x*2,l,mid,L,R),query(x*2+1,mid+1,r,L,R)));
}
return ans;
}
void rev(int x,int u,int num,int L,int R){
if(L<=u&&R>=u){
w[x]=max(num,w[x]);
}
if(L==R) return;
int mid=(L+R)/2;
rev(x*2,u,num,L,mid);
rev(x*2+1,u,num,mid+1,R);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
build(1,1,n);
while(m--){
char opt;
int x,y;
scanf("%c%d%d",&opt,&x,&y);
if(opt=='Q'){
ans=-1e9;
cout<<query(1,1,n,x,y)<<endl;
}
else{
if(a[x]<y){
a[x]=y;
rev(1,x,y,1,n);
}
else rev(1,x,a[x],1,n);
}
}
}