AC Code:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std;
const int N = 200005; struct node{int l,r,maxn;}
tree[n<<2];
int a[n];
void build (int m,int l,int r) {tree[m].l = l;
TREE[M].R = R;
if (L = = r) {TREE[M].MAXN = a[l];
return;
} int mid = (l+r) >>1;
Build (M<<1,l,mid);
Build ((m<<1) |1,mid+1,r);
TREE[M].MAXN = Max (tree[m<<1].maxn,tree[(m<<1) |1].MAXN);
} void Update (int m,int x,int val) {if (TREE[M].L = = x && TREE[M].R = = x) {tree[m].maxn = val;
return;
} int mid = (TREE[M].L+TREE[M].R) >>1;
if (x <= mid) update (M<<1,X,VAL);
else Update ((m<<1) |1,x,val);
TREE[M].MAXN = Max (tree[m<<1].maxn,tree[(m<<1) |1].MAXN);
} int query (int m,int l,int R) {if (TREE[M].L = = L && TREE[M].R = = r) return TREE[M].MAXN; int mid = (TREE[M].L+TREE[M].R) >>1;
if (R <= mid) return query (M<<1,L,R);
if (L > Mid) return query ((m<<1) |1,l,r);
Return max (query (m<<1,l,mid), query ((m<<1) |1,mid+1,r));
} int main () {int n,m;
while (~SCANF ("%d%d", &n,&m)) {for (int i = 1; I <= n; i++) scanf ("%d", &a[i]);
Build (1,1,n);
Char op[10];
int x, y;
while (m--) {scanf ("%s%d%d", op,&x,&y);
if (op[0] = = ' Q ') {printf ("%d\n", Query (1,x,y));
} else if (op[0] = = ' U ') {update (1,x,y);
}}} return 0; }