题目链接: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 }

 

posted on 2016-07-26 10:17  惟愿。。。  阅读(145)  评论(0编辑  收藏  举报