题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
Sample Input 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5 Sample Output 5 6 5
分析:与上一道敌兵布阵差不多不过节点信息保存区间成绩最好的那个同学就可以了,注意本题是多实例题。
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<queue> 5 #include<algorithm> 6 #include<time.h> 7 using namespace std; 8 9 const int maxn = 2005; 10 const int N=1000007; 11 12 #define lson rt<<1///rt*2 13 #define rson rt<<1|1///rt*2+1 14 15 int A[N]; 16 17 struct node 18 { 19 int l,r,s; 20 } tree[N<<2]; 21 22 void build(int l,int r,int rt) 23 { 24 tree[rt].l=l; 25 tree[rt].r=r; 26 27 if(l==r) 28 { 29 tree[rt].s=A[l]; 30 return ; 31 } 32 33 int mid=(l+r)/2; 34 35 build(l,mid,lson); 36 build(mid+1,r,rson); 37 38 tree[rt].s=max(tree[lson].s,tree[rson].s);///找大的那个 39 } 40 41 void update(int pos,int val, int rt) 42 { 43 tree[rt].s=max(tree[rt].s,val); 44 45 if(tree[rt].l==tree[rt].r) 46 return ; 47 48 int mid = (tree[rt].l+tree[rt].r)/2; 49 50 if(pos<=mid) 51 update(pos,val,lson); 52 else 53 update(pos,val,rson); 54 } 55 56 int query(int l,int r,int rt) 57 { 58 if(tree[rt].l==l&&tree[rt].r==r) 59 return tree[rt].s; 60 61 int mid = (tree[rt].l+tree[rt].r)/2; 62 63 if(r<=mid) 64 return query(l,r,lson); 65 else if(l>mid) 66 return query(l,r,rson); 67 else 68 { 69 int lsum,rsum; 70 lsum=query(l,mid,lson); 71 rsum=query(mid+1,r,rson); 72 return max(lsum,rsum);///最大的那个 73 } 74 } 75 76 int main() 77 { 78 int n,m,i,a,b; 79 char s[100]; 80 81 while(scanf("%d %d", &n,&m) != EOF) 82 { 83 for(i=1; i<=n; i++) 84 scanf("%d", &A[i]); 85 86 build(1,n,1); 87 88 while(m--) 89 { 90 scanf("%s", s); 91 if(s[0]=='Q') 92 { 93 scanf("%d%d", &a,&b); 94 printf("%d\n",query(a,b,1)); 95 continue; 96 } 97 98 scanf("%d%d", &a,&b); 99 update(a,b,1); 100 } 101 } 102 return 0; 103 }