题目:http://acm.hdu.edu.cn/showproblem.php?pid=1754
和上一题一样是模板题,就是那道题求得是和,这道求得是最大值:
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define N 201000 #define INF 0xfffffff #define Lson r<<1 #define Rson r<<1|1 struct Segment { int L, R, Max; int Mid() { return (L+R)>>1; } } a[N<<2]; void BuildTree(int r, int L, int R) { a[r].L = L; a[r].R = R; if(L == R) { scanf("%d", &a[r].Max); return ; } BuildTree(Lson, L, a[r].Mid()); BuildTree(Rson, a[r].Mid()+1, R); a[r].Max = max(a[Lson].Max, a[Rson].Max); } int Query(int r, int L, int R) { if(a[r].L == L && a[r].R == R) return a[r].Max; if(L > a[r].Mid()) return Query(Rson, L, R); else if(R <= a[r].Mid()) return Query(Lson, L, R); else { int Max1 = Query(Lson, L, a[r].Mid()); int Max2 = Query(Rson, a[r].Mid()+1, R); return max(Max1 , Max2); } } void Update(int r, int p, int x) { if(a[r].L == p && a[r].R == p) { a[r].Max = x; return ; } if(p > a[r].Mid()) Update(Rson, p, x); else Update(Lson, p, x); a[r].Max = max(a[Rson].Max, a[Lson].Max); } int main() { int n, m, a, b; char s[10]; while(scanf("%d%d",&n, &m) != EOF) { BuildTree(1, 1, n); for(int i=0; i<m; i++) { scanf("%s%d%d", s, &a, &b); if(s[0] == 'Q') printf("%d ", Query(1, a, b)); else Update(1, a, b); } } return 0; }