点修改区间查询 HDU1754

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int an[200010];
 7 struct Node
 8 {
 9     int l;
10     int r;
11     int ma;
12 }bn[800010];
13 
14 void build(int k,int l,int r)
15 {
16     bn[k].l=l;
17     bn[k].r=r;
18     if(l==r)
19     {
20         bn[k].ma=an[l];
21         return ;
22     }
23     int lk=k*2;
24     int rk=lk+1;
25     int mid=(l+r)/2;
26     build(lk,l,mid);
27     build(rk,mid+1,r);
28     bn[k].ma=max(bn[lk].ma,bn[rk].ma);
29 }
30 
31 void change(int k,int i,int a)
32 {
33     if(bn[k].l==i&&bn[k].r==i)
34     {
35         bn[k].ma=a;
36         return ;
37     }
38     int lk=k*2;
39     int rk=lk+1;
40     if(bn[lk].r>=i)
41         change(lk,i,a);
42     else if(bn[rk].l<=i)
43         change(rk,i,a);
44     bn[k].ma=max(bn[lk].ma,bn[rk].ma);
45 }
46 
47 int search(int k,int l,int r)
48 {
49     if(bn[k].l==l&&bn[k].r==r)
50     {
51         return bn[k].ma;
52     }
53     int lk=k*2;
54     int rk=lk+1;
55     if(bn[lk].r>=r)
56         return search(lk,l,r);
57     else if(bn[rk].l<=l)
58         return search(rk,l,r);
59     else
60         return max(search(lk,l,bn[lk].r),search(rk,bn[rk].l,r));
61 }
62 
63 int main()
64 {
65     int n,m;
66     while(scanf("%d%d",&n,&m)!=EOF)
67     {
68         for(int i=1;i<=n;i++)
69             scanf("%d",&an[i]);
70         build(1,1,n);
71         for(int i=0;i<m;i++)
72         {
73             char ca;
74             int a,b;
75             scanf(" %c ",&ca);
76             scanf("%d%d",&a,&b);
77             if(ca=='Q')
78                 printf("%d\n",search(1,a,b));
79             else if(ca=='U')
80                 change(1,a,b);
81         }
82     }
83     return 0;
84 }
View Code

 

posted @ 2015-07-31 10:06  相儒以沫  阅读(145)  评论(0编辑  收藏  举报