<span style="font-family: Arial, Helvetica, sans-serif;">#include<cstdio></span>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N=200100*4;
const int INF=1e9;
ll n,ans;
typedef struct Node
{
int l,r;
ll sum;
}node;
node t[N];
void build(int l,int r,int rt)
{
t[rt].l=l; t[rt].r=r;
if (l==r){
scanf("%lld",&t[rt].sum);
return;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
t[rt].sum=max(t[rt<<1].sum,t[rt<<1|1].sum) ;
}
void updata(int l,int r,int rt,int pos,ll v)
{
if (l==r) {
t[rt].sum=v;
return;
}
int m=(l+r)>>1;
if (m<pos) updata(m+1,r,rt<<1|1,pos,v);
else updata(l,m,rt<<1,pos,v);
t[rt].sum=max(t[rt<<1].sum,t[rt<<1|1].sum) ;
}
void query(int l,int r,int rt,int L,int R)
{
if (L<=l && r<=R){
ans=max(t[rt].sum ,ans) ;
return ;
}
int m=(l+r)>>1;
if (R<=m) query(l,m,rt<<1,L,R);
else if (m<L) query(m+1,r,rt<<1|1,L,R);
else {
query(l,m,rt<<1,L,R);
query(m+1,r,rt<<1|1,L,R);
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
//for (int i=1;i<10;i++) cout<<t[i].l<<" "<<t[i].r<<" "<<t[i].sum<<endl;; cout<<endl;
while(m--)
{
char c[2];
int a,b;
scanf("%s%d%d",&c,&a,&b);
if (c[0]=='Q'){
ans=0;
query(1,n,1,a,b);
cout<<ans<<endl;
}
else {
updata(1,n,1,a,b);
}
}
}
}