P1531
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100000
#define ls(x) (x<<1)
#define rs(x) (x<<1)+1
int a[MAXN];
struct Tree
{
int l,r,val;
};
int n;
struct SEG
{
Tree t[MAXN<<2];
void pushup(int x)
{
t[x].val=max(t[ls(x)].val, t[rs(x)].val);
return;
}
void build(int l, int r, int x)
{
t[x].l=l, t[x].r=r;
if(l==r)
{
t[x].val=a[l];
return;
}
int mid=(l+r)>>1;
build(l, mid, ls(x)), build(mid+1, r, rs(x));
pushup(x);
return;
}
void add(int l, int r, int k, int x)
{
if(t[x].l>r||t[x].r<l) return;
if(t[x].l==l&&t[x].r==r)
{
t[x].val = k;
return;
}
add(l, r, k, ls(x)),add(l, r, k, rs(x));
pushup(x);
return;
}
int ask(int l, int r, int x)
{
if(t[x].l>r||t[x].r<l) return 0;
if(t[x].l>=l&&t[x].r<=r)return t[x].val;
pushup(x);
return max(ask(l, r, ls(x)),ask(l, r, rs(x)));
}
}seg;
int main()
{
int m,x,y;
char tmp;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
seg.build(1,n,1);
for(int i=1;i<=m;i++)
{
cin>>tmp;
switch(tmp)
{
case 'Q':
cin>>x>>y;
cout<<seg.ask(x, y, 1)<<endl;
break;
case 'U':
cin>>x>>y;
if(a[x]<y)
{
seg.add(x, x, y, 1);
a[x]=y;
}
break;
}
}
return 0;
}