修改结点值,查询最大值 据lost牛说有更快的在线RMQ算法可以解这道题..问他是什么,不说..我回去慢慢想.. #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int size = 200001 ; int tot ; struct xds { int a, b ; int lson, rson, info ; }tree[size*3] ; int stu[size] ; void build(int a, int b) { int now = ++tot ; tree[now].a = a ; tree[now].b = b ; tree[now].info = 0 ; if(b - a > 0) { int mid = (a + b) >> 1 ; tree[now].lson = tot + 1 ; build(a, mid) ; tree[now].rson = tot + 1 ; build(mid + 1, b) ; tree[now].info = max(tree[tree[now].lson].info, tree[tree[now].rson].info) ; } else { tree[now].lson = tree[now].rson = 0 ; tree[now].info = stu[a] ; } //printf("a = %d b = %d info = %d/n", tree[now].a, tree[now].b, tree[now].info); } void update(int p, int s, int info) { if(tree[p].a == tree[p].b && tree[p].a == s) { tree[p].info = info ; return ; } int mid = (tree[p].a + tree[p].b) >> 1 ; if(s <= mid) update(tree[p].lson, s, info) ; else update(tree[p].rson, s, info) ; tree[p].info = max(tree[tree[p].lson].info, tree[tree[p].rson].info) ; //printf("a= %d b = %d info = %d/n", tree[p].a, tree[p].b, tree[p].info); } int query(int p, int a, int b) { if(tree[p].a == a && tree[p].b == b) { //printf("a = %d b = %d info = %d/n", a, b, tree[p].info); return tree[p].info ; } int mid = (tree[p].a + tree[p].b) >> 1 ; if(b <= mid) return query(tree[p].lson, a, b) ; else if(a > mid) return query(tree[p].rson, a, b) ; else return max(query(tree[p].lson, a, mid), query(tree[p].rson, mid + 1, b)) ; } int main (){ int N, M, i, j, num ; char s[2] ; while(scanf("%d%d", &N, &M) != EOF) { tot = 0 ; for(i = 1; i <= N; i ++) { scanf("%d", &stu[i]); } build(1, N) ; while(M --) { scanf("%s%d%d", s, &i, &j); switch (s[0]) { case 'Q' : printf("%d/n", query(1, i, j)) ;break ; case 'U' : update(1, i, j) ; } } } //system ("pause") ; return 0 ; }