链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
这次的代码和上个代码很相似,只不过上次的节点里存的是sum值,这次节点里存放的是Max, 正在慢慢找感觉
节点里保存的值是十分重要的!!!!
代码:
1 #include<stdio.h> 2 #include<algorithm> 3 #include<stdlib.h> 4 #include<string.h> 5 using namespace std; 6 7 #define Lson r<<1 8 #define Rson r<<1|1 9 10 const int N = 2*1e6+5; 11 12 struct SegmentTree 13 { 14 int L, R; 15 int MAX; 16 int Mid() 17 { 18 return (R+L)>>1; 19 } 20 }a[N<<2]; 21 22 void BuildSegTree(int r, int L, int R) 23 { 24 a[r].L=L, a[r].R=R; 25 26 if(L==R) 27 { 28 scanf("%d", &a[r].MAX); 29 return ; 30 } 31 32 BuildSegTree(Lson, L, a[r].Mid()); 33 BuildSegTree(Rson, a[r].Mid()+1, R); 34 35 a[r].MAX = max(a[Lson].MAX, a[Rson].MAX); 36 } 37 38 void Update(int r, int i, int e) 39 { 40 a[r].MAX = max(a[r].MAX, e); 41 42 if(a[r].L==a[r].R) 43 return ; 44 45 if(i<=a[r].Mid()) 46 Update(Lson, i, e); 47 else if(i>a[r].Mid()) 48 Update(Rson, i, e); 49 } 50 51 int Query(int r, int L, int R) 52 { 53 if(a[r].L==L && a[r].R==R) 54 return a[r].MAX; 55 56 if(R<=a[r].Mid()) 57 return Query(Lson, L, R); 58 else if(L>a[r].Mid()) 59 return Query(Rson, L, R); 60 else 61 { 62 int Lsum = Query(Lson, L, a[r].Mid()); 63 int Rsum = Query(Rson, a[r].Mid()+1, R); 64 65 return max(Lsum, Rsum); 66 } 67 } 68 69 int main() 70 { 71 int n, m; 72 73 while(scanf("%d%d", &n, &m)!=EOF) 74 { 75 BuildSegTree(1, 1, n); 76 77 char s[20]; 78 int L, R, A, B; 79 80 while(m--) 81 { 82 scanf("%s", s); 83 if(s[0]=='Q') 84 { 85 scanf("%d%d", &L, &R); 86 printf("%d\n", Query(1, L, R)); 87 } 88 else 89 { 90 scanf("%d%d", &A, &B); 91 Update(1, A, B); 92 } 93 } 94 } 95 return 0; 96 }
勿忘初心