#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7fffffffffffffff
ll read(){
ll x=0;
ll f=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
int n,m;
ll a[200001];
ll tree[200001<<2];
void pushup(int x){
tree[x]=max(tree[x<<1],tree[x<<1|1]);
}
void build(int x,int l,int r){
if(l==r){
tree[x]=a[l];
}else{
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
}
void update(int x,int l,int r,int T,int b){
if(l==r){
if(tree[x]<b)tree[x]=b;
}else{
int mid=(l+r)>>1;
if(T<=mid){
update(x<<1,l,mid,T,b);
}else{
update(x<<1|1,mid+1,r,T,b);
}
pushup(x);
}
}
ll query(int x,int l,int r,int L,int R){
if(L<=l&&r<=R){
return tree[x];
}else{
int mid=(l+r)>>1;
ll res=-inf;
if(L<=mid){
res=max(res,query(x<<1,l,mid,L,R));
}
if(R>mid){
res=max(res,query(x<<1,mid+1,r,L,R));
}
return res;
}
}
void putout(){
for(int i=1;i<=n;i++){
cout<<query(1,1,n,i,i)<<' ';
}
cout<<endl;
}
int main(){
n=read();
m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
char c;
int le,ri;
for(int i=1;i<=m;i++){
cin>>c;
le=read();
ri=read();
if(c=='Q'){
printf("%lld\n",query(1,1,n,le,ri));
}else{
update(1,1,n,le,ri);
}
}
return 0;
}