#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
#include <bits/stdc++.h>
using namespace std;
int MAX[];
//int max(int a,int b)
//{
// return a>b?a:b;
//}
void pushup(int rt)
{
MAX[rt]=max(MAX[rt<<],MAX[(rt<<)+]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&MAX[rt]);
return;
}
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,(rt<<)+);
pushup(rt);
}
void update(int p,int q,int l,int r,int rt)
{
if(l==r)
{
MAX[rt]=q;
return;
}
int m=(l+r)>>;
if(p<=m)
update(p,q,l,m,rt<<);
else
update(p,q,m+,r,(rt<<)+);
pushup(rt);
}
int getmax(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
return MAX[rt];
int m=(r+l)>>;
int ret=;
if(L<=m)
ret=max(ret,getmax(L,R,l,m,rt<<));
if(R>m)
ret=max(ret,getmax(L,R,m+,r,(rt<<)+));
return ret;
}
int main()
{
int n,m,a,b,i;
char c;
while(~scanf("%d %d",&n,&m))
{
build(,n,);
for(i=; i<m; i++)
{
scanf("%*c%c%d %d",&c,&a,&b);//*c与getchar一样
if(c=='Q')
printf("%d\n",getmax(a,b,,n,));
else
update(a,b,,n,);
}
}
return ;
}