#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int val[200010],ans; struct node{ int lf; int rg; int mx; }a[800020]; void Build_tree(int l,int r,int x) { a[x].lf=l;a[x].rg=r; if(l==r) { a[x].mx=val[l]; return ; } int mid=(l+r)/2; Build_tree(l,mid,x*2); Build_tree(mid+1,r,2*x+1); a[x].mx=max(a[2*x].mx,a[2*x+1].mx); } void Point_change(int x,int m,int y) { if(a[x].lf==a[x].rg) { a[x].mx=y; return ; } int mid=(a[x].lf+a[x].rg)/2; if(m<=mid) Point_change(2*x,m,y); else Point_change(2*x+1,m,y); a[x].mx=max(a[x*2].mx,a[2*x+1].mx); } int Que_max(int st,int ed,int x) { if(a[x].lf>=st&&a[x].rg<=ed) { return ans=a[x].mx; } int mid=(a[x].lf+a[x].rg)/2; int ans=0; if(st<=mid) ans=max(ans,Que_max(st,ed,2*x)); if(ed>mid) ans=max(ans,Que_max(st,ed,2*x+1)); return ans; } int main() { int n,m,x,y; char ch; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&val[i]); Build_tree(1,n,1); for(int i=1;i<=m;i++) { scanf("%s %d %d",&ch,&x,&y); if(ch=='Q') { int k=Que_max(x,y,1); cout<<k<<endl; } else Point_change(1,x,y); } } }