#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
struct node{
int l,r,v;
} tri[N * 4];
int n,m,a[N];
void build(int p,int l,int r){
tri[p].l = l;tri[p].r = r;
if(l == r){
tri[p].v = a[l];
return;
}
int mid = (l + r) / 2;
build(p * 2,l,mid);
build(p * 2 + 1,mid + 1,r);
tri[p].v = max(tri[p * 2].v,tri[p * 2 + 1].v);
}
void update(int p,int x,int value){
if(tri[p].l == tri[p].r and tri[p].l == x){
if(tri[p].v < value){
tri[p].v = value;
}
return;
}
int mid = (tri[p].l + tri[p].r) / 2;
if(mid >= x){
update(p * 2,x,value);
}
if(mid < x){
update(p * 2 + 1,x,value);
}
tri[p].v = max(tri[p * 2].v,tri[p * 2 + 1].v);
}
int query(int p,int l,int r){
if(tri[p].l >= l and tri[p].r <= r){
return tri[p].v;
}
int mid = (tri[p].l + tri[p].r) / 2,ret;
if(mid >= l){
ret = query(p * 2,l,r);
}
if(mid < r){
ret = max(ret,query(p * 2 + 1,l,r));
}
return ret;
}
int main(){
cin >> n >> m;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
build(1,1,n);
for(int i = 1;i <= m;i ++){
char opt;int a,b;
cin >> opt >> a >> b;
if(opt == 'Q'){
cout << query(1,a,b) << endl;
}else{
update(1,a,b);
}
}
return 0;
}