#include<bits/stdc++.h>
using namespace std;
const int inf=1e6+5;
#define INF 0x7f7f7f7f
#define ll long long
ll v;
int n,l,r,w,m,f,a[inf*2];
struct node{
int l,r;
ll pre,lazy;
#define l(x) t[x].l
#define r(x) t[x].r
#define m(x) t[x].pre
#define lazy(x) t[x].lazy
#define ls p<<1
#define rs ls|1
}t[inf*4];
char ch;
void push_up(int p) {
m(p)=max(m(ls),m(rs));
}
void build(int p,int l,int r) {
l(p)=l,r(p)=r;
if(l==r) {
m(p)=a[l];
return ;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(p);
}
void spread(int p) {
if(!lazy(p)) return ;
m(ls)+=lazy(p);
m(rs)+=lazy(p);
lazy(ls)+=lazy(p);
lazy(rs)+=lazy(p);
lazy(p)=0;
}
void change(int p,int l,int r,ll x) {
if(l(p)>r||r(p)<l) return ;
if(l(p)==l&&r(p)==r) {
m(p)=max(x,m(p));
//lazy(p)+=x;
return ;
}
// spread(p);
change(ls,l,r,x);
change(rs,l,r,x);
push_up(p);
}
ll ask(int p,int l,int r) {
if(l(p)==l&&r(p)==r) return m(p);
if(l(p)>r||r(p)<l) return m(p);
// spread(p);
return max(ask(ls,l,r),ask(rs,l,r));
}
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 p;
int l,r,k;
cin>>p>>l>>r;
if(p=='U')
change(1,l,l,r);
else
cout<<ask(1,l,r)<<endl;
}
return 0;
}