B - I Hate It HDU - 1754 线段树区间最大值板子(单点更新,区间最大)

  第一次打 改了半天  各种小错误 难受

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int maxn=2000000+7;
 5 int a[maxn],n;
 6 struct Node{
 7     int l,r;
 8     long long Max,lazy;
 9     void update(long long  val){
10         ;//本题没用
11     }
12 }tree[maxn*5];
13 void push_up(int x){
14     tree[x].Max=max(tree[x<<1].Max,tree[x<<1|1].Max);
15 }
16 
17 void push_down(int x){//本题不用
18     int lazyval=tree[x].lazy;
19     if(lazyval){
20         tree[x<<1].update(lazyval);
21         tree[x<<1|1].update(lazyval);
22         tree[x].lazy=0;
23     }
24 }
25 void build(int x,int l,int r){
26         tree[x].l=l,tree[x].r=r;
27         tree[x].Max=tree[x].lazy=0;
28         if(l==r){//建树 初始化叶子
29             tree[x].Max=a[l];
30         }
31         else {//递归建树
32             int mid=l+r>>1;
33             build(x<<1,l,mid);
34             build(x<<1|1,mid+1,r);
35             push_up(x);
36         }
37 }
38 void  update(int x,int l,int r,long long  val){
39     int L=tree[x].l,R=tree[x].r;
40     if(l==L&&R==r&&L==R){tree[x].Max=val;return ;}//单点修改值
41      if(r<L||l>R)return ;//如果这两个区间没有交集 x的区间就不用修改了
42          //int mid=L+R>>1;
43         update(x<<1,l,r,val);//分别修改左右区间
44         update(x<<1|1,l,r,val);
45         push_up(x);//更新左右区间
46 }
47 
48 long long query(int x,int l,int r){
49     int L=tree[x].l,R=tree[x].r;
50     if(l<=L&&R<=r){return tree[x].Max;}//如果当前节点区间完全被要查询区间包含 直接返回该节点的最大值即可
51      if(r<L||l>R)return 0;//如果当前区间不在要查询区间里面,返回一个不影响其他查找的最小值 0 (学生分数都是正数)
52     //     int mid=L+R>>1;
53          long long ans=0;
54         ans=max(query(x<<1,l,r),query(x<<1|1,l,r));
55     return ans;
56 }
57 
58 int main(){
59 int n,q;
60 while(scanf("%d%d",&n,&q)==2){
61     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
62     build(1,1,n);
63     char op[10];
64         int l,r;
65     for(int i=1;i<=q;i++)
66     {
67         scanf("%s%d%d",op,&l,&r);
68         if(op[0]=='Q'){
69             //int l,r;
70             //scanf("%d%d",&l,&r);
71             printf("%lld\n",query(1,l,r));
72         }
73         else if(op[0]=='U'){
74             //int l,r;
75             //scanf("%d%d",&l,&r);
76             update(1,l,l,r);
77         }
78     }
79 
80 }
81     return 0;
82 }

 

posted @ 2019-01-19 19:28  tttttttttrx  阅读(177)  评论(0编辑  收藏  举报