#include<bits/stdc++.h>
using namespace std;
int t,n,m;
struct node
{
int l,r,m;
}a[200000*4+5];
void build(int l, int r, int id)
{
a[id].l=l;
a[id].r=r;
if(l==r)
{
scanf("%d",&a[id].m);
return;
}
int mid=(l+r)>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
a[id].m=max(a[id<<1].m,a[id<<1|1].m);
}
void updata(int x, int y, int id)
{
int l=a[id].l;
int r=a[id].r;
int mid=(l+r)/2;
if(l==r)
{
a[id].m=y;
return ;
}
if(x<=mid)
updata(x,y,id<<1);
else
updata(x,y,id<<1|1);
a[id].m=max(a[id<<1].m,a[id<<1|1].m);
}
int query(int l, int r, int id)
{
if(l<=a[id].l&&r>=a[id].r)
{
return a[id].m;
}
int mid=(a[id].l+a[id].r)/2;
if(l<=mid)
{
return query(l,r,id<<1);
}
if(r>mid)
{
return query(l,r,id<<1|1);
}
return max(query(l,mid,id<<1),query(mid+1,r,id<<1|1));
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
build(1,n,1);
for(int i=1;i<=m;i++)
{
char s[10];
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[0]=='Q')
{
printf("%d\n",query(a,b,1));
}
if(s[0]=='U')
{
updata(a,b,1);
}
}
}
return 0;
}