洛谷P1531 I Hate It 线段树

洛谷P1531 I Hate It

线段树 单点修改 区间求最大

 

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream> 
 9 using namespace std ; 
10 
11 const int maxn = 200011 ; 
12 struct node{
13     int l,r,mx ; 
14 }tree[4*maxn] ;
15 int a[maxn] ; 
16 int n,Q,ans,x,y ; 
17 char s[2] ; 
18 
19 inline int read() 
20 {
21     char ch = getchar() ; 
22     int x = 0 ,f = 1 ; 
23     while(ch<'0'||ch>'9') { if(f=='-') f = -1 ; ch = getchar() ; } 
24     while(ch>='0'&&ch<='9') { x = x*10 + ch - 48 ; ch = getchar() ; } 
25     return x * f ; 
26 }
27 
28 inline void pushup(int root) 
29 {
30     tree[root].mx = max( tree[root*2].mx,tree[root*2+1].mx ) ; 
31 }
32 
33 inline void build(int l,int r,int root) 
34 {
35     tree[root].l = l ;   tree[root].r = r ; 
36     if(l==r) 
37     {
38         tree[root].mx = a[ l ] ; 
39         return ; 
40     }
41     int mid = (l+r) / 2  ; 
42     build(l,mid,root*2) ; 
43     build(mid+1,r,root*2+1) ; 
44     pushup(root) ; 
45 }
46 
47 inline void updata(int pos,int val,int root) 
48 {
49     if(tree[root].l==tree[root].r) 
50     {
51         if(val > tree[root].mx) tree[root].mx = val ; 
52         return ; 
53     }
54     int mid = (tree[root].l+tree[root].r) / 2 ; 
55     if( pos<=mid ) 
56         updata(pos,val,root*2) ; 
57     else
58         updata(pos,val,root*2+1) ; 
59     pushup(root) ; 
60 }
61 
62 inline int query(int l,int r,int root) 
63 {
64     if(tree[root].l==l&&tree[root].r==r) 
65         return tree[root].mx ; 
66     int mid = ( tree[root].l + tree[root].r ) / 2 ;  
67     if ( l > mid ) return query(l,r,root*2+1) ; 
68     if ( r<=mid )  return query(l,r,root*2) ;
69     int ans = max( query(l,mid,root*2),query(mid+1,r,root*2+1) ) ; 
70     return ans ; 
71 }
72 
73 int main() 
74 {
75     n = read() ;   Q = read() ; 
76     for(int i=1;i<=n;i++) 
77         a[ i ] = read() ; 
78     build(1,n,1) ; 
79     
80     for(int i=1;i<=Q;i++) 
81     {
82         scanf("%s",s) ; 
83         x = read() ;  y = read() ; 
84         if(s[0]=='U') 
85             updata(x,y,1) ;
86         else 
87         {
88             ans = query(x,y,1) ;   
89             printf("%d\n",ans) ; 
90         }
91     }
92     return 0 ; 
93 }

 

posted @ 2017-06-27 12:44  third2333  阅读(118)  评论(0编辑  收藏  举报