题目来源:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
代码如下:
const int Max_N = 200005; int Max[Max_N<<2]; int x[Max_N]; void push_up(int root){ Max[root]=max( Max[root<<1], Max[root<<1|1] ); } void make_tree(int L, int R, int root){ if(L == R){ Max[root]=x[L]; return; } int mid= (L + R)>>1; make_tree(L, mid , root<<1); make_tree(mid+1, R, root<<1|1); push_up(root); } void update(int id, int c, int L, int R, int root){ if(L == R){ Max[root] = c; return ; } int mid=(L + R)>>1; if(id <= mid) update(id, c, L, mid, root<<1); else update(id, c, mid+1, R, root<<1|1); push_up(root); } int query(int l, int r, int L, int R, int root){ if(l<=L && R <= r) return Max[root]; int mid=(L + R)>>1; if(mid >= r) return query(l,r,L, mid, root<<1); else if(mid < l) return query(l,r,mid+1, R, root<<1|1); else return max(query(l,r,mid+1, R, root<<1|1) ,query(l , r, L, mid, root<<1) ); } int main(){ int n,m; char s[3]; int a,b; while(scanf("%d%d",&n,&m) != EOF){ for(int i=1;i<=n; i++) scanf("%d",&x[i]); make_tree(1,n,1); while(m--){ scanf("%s",s); scanf("%d%d",&a,&b); if(s[0]=='Q') printf("%d ",query(a,b,1,n,1)); else update(a,b,1,n,1); } } return 0; }