题目背景
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。
题目描述
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩
输入输出格式
输入格式:
第一行,有两个正整数 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 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
输出样例#1:
5659 线段树区间查询+单点修改
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 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 node23 {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 >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 >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