#include<iostream> #include<cstring> using namespace std; const int N=2e5+10; int m,n,p; struct node{ int l,r; int v; }tr[N*4]; void pushup(int u) { tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v); } void build(int u,int l,int r) { tr[u]={l,r}; if(l==r) { scanf("%d",&tr[u].v); return ; } int mid=l+r>>1; build(u<<1,l,mid); build(u<<1|1,mid+1,r); pushup(u); } int query(int u,int l,int r) { if(tr[u].l>=l&&tr[u].r<=r) return tr[u].v; int mid=tr[u].l+tr[u].r>>1; int v=0; if(l<=mid) v=max(v,query(u<<1,l,r)); if(r>mid) v=max(v,query(u<<1|1,l,r)); return v; } void modify(int u,int x,int p) { if(tr[u].l==x&&tr[u].r==x) { tr[u].v=p; return; } else { int mid=tr[u].l+tr[u].r>>1; if(x<=mid) modify(u<<1,x,p); else modify(u<<1|1,x,p); pushup(u); } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int l,r; int x; build(1,1,n); char op[3]; while(m--) { scanf("%s%d%d",op,&l,&r); if(op[0]=='Q') printf("%d ",query(1,l,r)); else modify(1,l,r); } } return 0; }