#include <stdio.h> #include <string.h> #define maxn 200002 struct node{ int l,r,w; }e[maxn*4]; int f[maxn]; int max(int a,int b) { return a>b?a:b; } void build(int a,int b,int c) { // printf("%d %d\n",a,b); if(a==b) { e[c].l=e[c].r=a; e[c].w=f[a]; return ; } e[c].l=a; e[c].r=b; int mid=(a+b)/2; build(a,mid,2*c); build(mid+1,b,2*c+1); e[c].w=max(e[2*c].w,e[2*c+1].w); } void update(int a,int b,int c,int val) { if(e[c].l==a&&e[c].r==b) { e[c].w=val; return; } int mid=(e[c].l+e[c].r)/2; if(b<=mid) update(a,b,2*c,val); else if(a>mid) update(a,b,2*c+1,val); else { update(a,mid,2*c,val); update(mid+1,b,2*c+1,val); } e[c].w=max(e[2*c].w,e[2*c+1].w); } int query(int a,int b,int c) { if(e[c].l==a&&e[c].r==b) { return e[c].w; } int mid=(e[c].l+e[c].r)/2; if(b<=mid) return query(a,b,2*c); else if(a>mid) return query(a,b,2*c+1); else return max(query(a,mid,2*c),query(mid+1,b,2*c+1)); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int i,j,k,a,b; char s[2]; for(i=1;i<=n;i++) scanf("%d",&f[i]); build(1,n,1); for(i=0;i<m;i++) { scanf("%s%d%d",s,&a,&b); if(s[0]=='U') update(a,a,1,b); else printf("%d\n",query(a,b,1)); } } return 0; }