#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int tree[2*N],l[2*N],r[2*N],idx;
int a[N];
int print(int L,int R)
{
int mid=(L+R)/2;
if(L==R)
{
tree[++idx]=a[R];
return idx;
}
int pos=++idx;
l[pos]=print(L,mid);
r[pos]=print(mid+1,R);
tree[pos]=max(tree[l[pos]],tree[r[pos]]);
return pos;
}
int n,Q;
int work(int L,int R,int lx,int rx,int pos)
{
if(L==lx&&R==rx)
{
return tree[pos];
}
int mid=(L+R)/2;
if(rx<=mid)
{
return work(L,mid,lx,rx,l[pos]);
}
if(lx>mid)
{
return work(mid+1,R,lx,rx,r[pos]);
}
return max(work(L,mid,lx,mid,l[pos]),work(mid+1,R,mid+1,rx,r[pos]));
}
int main()
{
cin>>n>>Q;
for(int i=1;i<=n;i++)cin>>a[i];
print(1,n);
while(Q--)
{
char op;cin>>op;
int lx,rx;cin>>lx>>rx;
if(op=='Q')
{
cout<<work(1,n,lx,rx,1)<<endl;
}
else if(op=='U')
{
if(a[lx]<rx)a[lx]=rx;
memset(tree,0,sizeof(tree));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
idx=0;
print(1,n);
}
}
return 0;
}