HDU - 1754 I Hate It

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。Input本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
Output对于每一次询问操作,在一行里面输出最高成绩。Sample Input

5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5

Sample Output

5
6
5
9


        
 

Hint

Huge input,the C function scanf() will work better than cin
        
 使用线段树点更新,区间查询功能很简单。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define ls o<<1
 5 #define rs o<<1|1
 6 #define lson L,mid,ls
 7 #define rson mid+1,R,rs
 8 #define middnf int mid=(L+R)>>1;
 9 
10 using namespace std;
11 
12 int mx[800001];
13 
14 int max(int a,int b)
15 {
16     return a>b?a:b;
17 }
18 
19 void pushup(int o)
20 {
21     mx[o]=max(mx[ls],mx[rs]);
22 }
23 
24 void build(int L,int R,int o)
25 {
26     if(L==R)
27     {
28         scanf("%d",&mx[o]);
29         return ;
30     }
31     middnf;
32     build(lson);
33     build(rson);
34     pushup(o);
35     //cout<<o<<" "<<mx[o]<<endl;
36 }
37 
38 void update(int p,int L,int R,int o,int v)
39 {
40     if(L==R)
41     {
42         mx[o] = v;
43         return;
44     }
45     middnf;
46     if(p<=mid) 
47         update(p,lson,v);
48         else 
49             update(p,rson,v);
50     pushup(o);
51 }
52 
53 int query(int l,int r,int L,int R,int o)
54 {
55     if(l<=L&&R<=r) 
56         return mx[o];
57     middnf;
58     int ret = 0;
59     if(l<=mid) 
60         ret = max(ret,query(l,r,lson));
61     if(r>mid) 
62         ret = max(ret,query(l,r,rson));
63     return ret;
64 }
65 
66 int main()
67 {
68     int n,m,x,y;
69     char c;
70     while(~scanf("%d %d",&n,&m))
71     {
72         build(1,n,1);    
73         /*for(int i=1;i<=20;i++)
74             cout<<mx[i]<<" ";*/
75         for(int i=0;i<m;i++)
76         {
77             scanf("%*c%c",&c);
78             if(c=='Q')
79             {
80                 scanf("%d%d",&x,&y);
81                 int man=query(x,y,1,n,1);
82                 printf("%d\n",man);
83             }
84             else
85             {
86                 scanf("%d%d",&x,&y);
87                 update(x,1,n,1,y);
88             }
89         }
90     }    
91     
92     
93     return 0;
94 }

 

posted @ 2017-08-22 08:16  西北会法语  阅读(119)  评论(0编辑  收藏  举报