#include<bits/stdc++.h>
#define MAXN 100005
#define lid id<<1
#define rid id<<1|1
using namespace std;
struct seg_tree{
int l,r;
int maxn = -105;
}tr[MAXN*4];
int a[MAXN],li,ri,n,m;
void pushup(int id){
tr[id].maxn = max(tr[lid].maxn,tr[rid].maxn);
}
void build(int id,int l,int r){
tr[id].l = l;
tr[id].r = r;
if(l==r){
tr[id].maxn = a[l];
return;
}
int mid = (l+r)>>1;
build(lid,l,mid);
build(rid,mid+1,r);
pushup(id);
}
void modify(int id, int x, int v){
if(tr[id].l == tr[id].r){
tr[id].maxn = v;
return;
}
int mid = (tr[id].l+tr[id].r) >> 1;
modify(x<=mid?lid:rid, x, v);
tr[id].maxn = max(tr[lid].maxn,tr[rid].maxn);
}
int querymaxn(int id,int l,int r){
if(l==tr[id].l&&r==tr[id].r){
return tr[id].maxn;
}
int mid = (tr[id].l+tr[id].r)>>1;
if(r<=mid)
return querymaxn(lid,l,r);
if(l>mid)
return querymaxn(rid,l,r);
return max(querymaxn(lid,l,mid),querymaxn(rid,mid+1,r));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
char op;
cin>>op;
scanf("%d%d",&li,&ri);
if(op=='Q'){
printf("%d\n",querymaxn(1,li,ri));
}
else{
modify(1,li,ri);
}
}
return 0;
}