hdu--1754 线段树区间求最大值

线段树区间求最大值简单入门题

每次更新的时候递归找到最终的叶子更新完叶子节点值,之后在返回更新父亲节点的值。

 1 #include<iostream>
 2 #include<string>
 3 #define MAX 200010
 4 using namespace std;
 5 int num[MAX];
 6 struct SegTree
 7 {
 8     int left,right,value;
 9     int calmid()
10     {
11         return (left+right)>>1;
12     }
13 }tt[MAX*3];
14 
15 int bulid(int s,int t,int step)
16 {
17     tt[step].left=s;
18     tt[step].right=t;
19     if(s==t) 
20         return tt[step].value=num[s];
21     int mid=tt[step].calmid();
22     return tt[step].value=max(bulid(s,mid,step*2),bulid(mid+1,t,step*2+1));
23 }
24 
25 int update(int id,int x,int step)
26 {
27     if(tt[step].right==tt[step].left&&tt[step].left==id){
28         return tt[step].value=x;
29     }
30     int mid=tt[step].calmid();
31     if(id<=mid){
32         return tt[step].value=max(tt[step].value,update(id,x,step*2));
33     }
34     else return tt[step].value=max(tt[step].value,update(id,x,step*2+1));
35 }
36 
37 int query(int s,int t,int step)
38 {
39     if(s<=tt[step].left&&tt[step].right<=t)
40         return tt[step].value;
41     int mid=tt[step].calmid();
42     if(t<=mid)
43         return query(s,t,step*2);
44     else if(mid<s)
45         return query(s,t,step*2+1);
46     else return max(query(s,t,step*2),query(s,t,step*2+1));
47 }
48 //void print(int N)
49 //{
50 //    for(int i=1;i<=N;i++)
51 //        cout<<tt[i].left<<" "<<tt[i].right<<" "<<tt[i].value<<endl;
52 //    cout<<endl<<endl;
53 //}
54 
55 int main()
56 {
57     int N,M,a,b;
58     char c;
59     while(cin>>N>>M){
60         memset(num,0,sizeof(num));
61         memset(tt,0,sizeof(tt));
62         for(int i=1;i<=N;i++)
63             cin>>num[i];
64         bulid(1,N,1);
65         for(int i=0;i<M;i++)
66         {
67             cin>>c>>a>>b;
68             if(c=='Q')
69                 cout<<query(a,b,1)<<endl;
70             else {
71                 update(a,b,1);
72             }
73         }
74 
75     }
76     return 0;
77 }
78 
79 /*
80 5 6
81 6 2 4 3 10
82 Q 1 5
83 U 3 11
84 Q 3 4
85 Q 4 5
86 U 2 12
87 Q 1 5
88 */

 

posted @ 2012-07-12 16:48  HUJJ  阅读(348)  评论(0编辑  收藏  举报