#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
struct tree
{
int l,r,maxn;
}a[1000005];
int read()
{
int x=0,t=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
t=-1;
ch=getchar();
}
while (isdigit(ch))
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*t;
}
void build(int k,int ll,int rr)
{
a[k].l=ll;
a[k].r=rr;
if (ll==rr)
{
a[k].maxn=read();
return ;
}
int mid=(ll+rr)>>1;
build(k<<1,ll,mid);
build(k<<1|1,mid+1,rr);
a[k].maxn=max(a[k<<1].maxn,a[k<<1|1].maxn);
return ;
}
void update(int k)
{
int ll=a[k].l,rr=a[k].r;
if (ll==rr)
{
a[k].maxn=max(a[k].maxn,y);
return ;
}
int mid=(ll+rr)>>1;
if (x<=mid)
update(k<<1);
else
update(k<<1|1);
a[k].maxn=max(a[k<<1].maxn,a[k<<1|1].maxn);
}
int print(int k)
{
int ll=a[k].l,rr=a[k].r;
if (ll>=x&&rr<=y)
return a[k].maxn;
int mid=(ll+rr)>>1,ans=0;
if (x<=mid)
ans=max(ans,print(k<<1));
if (y>mid)
ans=max(ans,print(k<<1|1));
return ans;
}
int main()
{
n=read();
m=read();
build(1,1,n);
for (int i=1;i<=m;++i)
{
char o;
o=getchar();
x=read();
y=read();
if (o=='U')
update(1);
else
printf("%d\n",print(1));
}
return 0;
}