线段树。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #define max 2000002 4 5 using namespace std; 6 7 typedef struct 8 { 9 int l, r; 10 int val; 11 }node; 12 13 node t[4*max]; 14 15 void build(int l, int r, int rt) 16 { 17 t[rt].l=l; 18 t[rt].r=r; 19 if (l == r) 20 { 21 scanf("%d", &t[rt].val); 22 return ; 23 } 24 int m=(l+r)>>1; 25 build(l, m, rt<<1); 26 build(m+1, r, rt<<1|1); 27 t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val; 28 } 29 30 void update(int p, int v, int rt) 31 { 32 if (t[rt].r == t[rt].l) 33 { 34 t[rt].val=v; 35 return ; 36 } 37 int m=(t[rt].r+t[rt].l)>>1; 38 if (p <= m) update(p, v, rt<<1); 39 else update(p, v, rt<<1|1); 40 t[rt].val= t[rt<<1].val > t[rt<<1|1].val ? t[rt<<1].val : t[rt<<1|1].val; 41 } 42 43 int maxv(int L, int R, int rt) 44 { 45 if (L == t[rt].l && R == t[rt].r) 46 return t[rt].val; 47 int m=(t[rt].r+t[rt].l)>>1; 48 if (L > m) 49 return maxv(L, R, rt<<1|1); 50 else if (R <= m) 51 return maxv(L, R, rt<<1); 52 else 53 { 54 int t1=maxv(L, m, rt<<1); 55 int t2=maxv(m+1, R, rt<<1|1); 56 if (t1 > t2) return t1; 57 else return t2; 58 } 59 60 } 61 62 int main() 63 { 64 int a, b; 65 int n, m; 66 char op[2]; 67 while(scanf("%d%d%*c", &n, &m) != EOF) 68 { 69 build(1, n, 1); 70 while(m--) 71 { 72 scanf("%s%d%d%*c", op, &a, &b); 73 if (op[0] == 'U') 74 update(a, b, 1); 75 else if (op[0] == 'Q') 76 printf("%d\n", maxv(a, b, 1)); 77 } 78 } 79 return 0; 80 }