P1531 I Hate It

题目背景

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

题目描述

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩

输入输出格式

输入格式:

 

第一行,有两个正整数 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'的时候,表示这是一条更新操作,如果当前A学生的成绩低于B,则把ID为A的学生的成绩更改为B,否则不改动。

 

输出格式:

 

对于每一次询问操作,在一行里面输出最高成绩

 

输入输出样例

输入样例#1:
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
输出样例#1:
5
6
5
9

线段树区间查询+单点修改

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define ls k<<1
 8 #define rs k<<1|1
 9 using namespace std;
10 const int MAXN=2000001;
11 void read(int &n)
12 {
13     char c='+';int x=0;bool flag=0;
14     while(c<'0'||c>'9')
15     {c=getchar();if(c=='-')flag=1;}
16     while(c>='0'&&c<='9')
17     {x=x*10+c-48,c=getchar();}
18     flag==1?n=-x:n=x;
19 }
20 int n,m;
21 int ans=-1;
22 struct node
23 {
24     int l,r,w;
25 }tree[MAXN*4];
26 void update(int k)
27 {
28     tree[k].w=max(tree[ls].w,tree[rs].w);
29 }
30 void build_tree(int ll,int rr,int k)
31 {
32     tree[k].l=ll;tree[k].r=rr;
33     if(ll==rr)
34     {
35         read(tree[k].w);
36         return ;
37     }
38     int mid=(ll+rr)>>1;
39     build_tree(ll,mid,ls);
40     build_tree(mid+1,rr,rs);
41     update(k);
42 }
43 void query(int ll,int rr,int k)
44 {
45     if(ll>tree[k].r||rr<tree[k].l)
46         return ;
47     if(ll<=tree[k].l&&tree[k].r<=rr)
48     {
49         ans=max(ans,tree[k].w);
50         return ;
51     }
52     int mid=(tree[k].l+tree[k].r)>>1;
53     query(ll,rr,ls);
54     query(ll,rr,rs);
55 }
56 void change(int pos,int v,int k)
57 {
58     if(pos>tree[k].r||pos<tree[k].l)
59         return ;
60     if(tree[k].l==tree[k].r)
61     {
62         tree[k].w=v;
63         return ;
64     }
65     change(pos,v,ls);
66     change(pos,v,rs);
67     update(k);
68 }
69 int main()
70 {
71     read(n);read(m);
72     build_tree(1,n,1);
73     for(int i=1;i<=m;i++)
74     {
75         string s;
76         cin>>s;
77         if(s[0]=='Q')// 查询
78         {
79             int l,r;
80             read(l);read(r);
81             ans=0;
82             query(l,r,1);
83             printf("%d\n",ans);
84         } 
85         else 
86         {
87             int x,y;
88             read(x);read(y);
89             ans=0;
90             query(x,x,1);
91             if(ans<y)
92             change(x,y,1);
93         }
94     }
95     return 0;
96 } 

 

 
posted @ 2017-07-08 18:27  自为风月马前卒  阅读(205)  评论(0编辑  收藏  举报

Contact with me