//绝对原创,欢迎交流!!
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define MAX 200010
struct node
{
int left;
int right;
int value;
};
node tree[MAX*4];
void Build_tree(int p,int l,int r)
{
tree[p].left=l;
tree[p].right=r;
if(l==r)
{
scanf("%d",&tree[p].value);
return ;
}
int mid=(l+r)/2;
Build_tree(p*2,l,mid);
Build_tree(p*2+1,mid+1,r);
tree[p].value=max(tree[p*2].value,tree[p*2+1].value);
}
void Update(int p,int s,int v)
{
if(s>tree[p].right||s<tree[p].left)
return ;
if(s>=tree[p].left&&s<=tree[p].right)
{
tree[p].value=max(tree[p].value,v);
if(tree[p].left==tree[p].right)
return ;
}
Update(p*2,s,v);
Update(p*2+1,s,v);
}
int Query(int p,int l,int r)
{
if(l<=tree[p].left&&tree[p].right<=r)
return tree[p].value;
int mid=(tree[p].left+tree[p].right)/2;
if(l>mid)
return Query(p*2+1,l,r);
else if(r<=mid)
return Query(p*2,l,r);
else
return max(Query(p*2,l,mid),Query(p*2+1,mid+1,r));
}
int main()
{
char str[20];
int n,m,i,j,l,r,p,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
Build_tree(1,1,n);
for(i=0; i<m; i++)
{
scanf("%s",&str);
if(str[0]=='U')
{
scanf("%d%d",&p,&v);
Update(1,p,v);
}
else
{
scanf("%d%d",&l,&r);
printf("%d\n",Query(1,l,r));
}
}
}
return 0;
}