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 */

 

你可能感兴趣的:(HDU)