hdu 1754

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

直接线段树。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int maxn=200006,maxm=5010;
 6 int a[maxn],ans[maxm];
 7 struct{
 8     int lef,rig,sum;
 9 } tree[maxn*4];
10 int n, ANS;
11 
12 int my_max(int x,int y)
13 {
14     return x>y?x:y;
15 }
16 
17 void build(int x,int y,int now)
18 {
19     tree[now].lef=x;
20     tree[now].rig=y;
21     if(x==y){
22         scanf("%d",&tree[now].sum);
23         return ;
24     }
25     int mid=(x+y)>>1;
26     build( x, mid, now<<1);
27     build( mid+1, y, now<<1|1);
28     tree[now].sum=my_max(tree[now<<1].sum,tree[now<<1|1].sum);
29 }
30 
31 void add(int x,int y,int now,int goal,int add_num)
32 {
33     if(x==y){
34         tree[now].sum=add_num;
35         return ;
36     }
37     int mid=(x+y)>>1;
38     if(goal<=mid){
39         add( x, mid, now<<1, goal, add_num);
40     }
41     else{
42         add( mid+1, y, now<<1|1, goal, add_num);
43     }
44     tree[now].sum=my_max(tree[now<<1|1].sum,tree[now<<1].sum);
45 }
46 
47 void query(int x,int y,int now, int eachx,int eachy)
48 {
49     if(x>=eachx&&y<=eachy){
50         ANS=my_max(ANS,tree[now].sum);
51         return ;
52     }
53     int mid=(x+y)>>1;
54     if(mid>=eachy){
55         query( x, mid, now<<1, eachx, eachy);
56     }
57     else if(mid<eachx){
58         query( mid+1, y, now<<1|1, eachx, eachy);
59     }
60     else{
61         query( x, mid, now<<1, eachx, eachy);
62         query( mid+1, y, now<<1|1, eachx, eachy);
63     }
64 }
65 
66 int main()
67 {
68     int m;
69     while( ~scanf("%d%d",&n,&m)){
70         char order[10];
71         int num=0;
72         build(1,n,1);
73         int x,y;
74         while(m--){
75             scanf("%s",order);
76             scanf("%d%d",&x,&y);
77             if(order[0]=='U') add(1,n,1,x,y);
78             if(order[0]=='Q'){
79                 ANS=0;
80                 query( 1, n, 1, x, y);
81                 ans[++num]=ANS;
82             }
83         }
84         for(int i=1;i<=num;i++){
85             printf("%d\n",ans[i]);
86         }
87     }
88     return 0;
89 }

 

posted @ 2018-07-21 20:30  flyer_duck  阅读(113)  评论(0编辑  收藏  举报