题目背景
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。
题目描述
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩
输入输出格式
输入格式:
第一行,有两个正整数 N 和 M ( 0
输出格式:
对于每一次询问操作,在一行里面输出最高成绩
输入输出样例
输入样例#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
#include<bits/stdc++.h>
using namespace std;
const int MAXN=800000+2;
struct edge {
int l,r,mx;
} tree[MAXN];
int a[MAXN];
int n,m;
void buildtree(int x,int l,int r) {
tree[x].l=l;
tree[x].r=r;
if(l==r) {
tree[x].mx=a[l];
return;
}
buildtree(x*2,l,(l+r)>>1);
buildtree(x*2+1,1+((l+r)>>1),r);
tree[x].mx=max(tree[x*2].mx,tree[x*2+1].mx);
}
void update(int x,int l,int r,int k) {
if(tree[x].l>=l && tree[x].r<=r) {
tree[x].mx=max(tree[x].mx,k);
return;
}
if(tree[x].l>r || tree[x].r<l) return;
update(x*2,l,r,k);
update(x*2+1,l,r,k);
tree[x].mx=max(tree[x*2].mx,tree[x*2+1].mx);
}
int query(int x,int l,int r) {
if(tree[x].l>=l && tree[x].r<=r) return tree[x].mx;
if(tree[x].l>r || tree[x].r<l) return 0;
int ans=0;
ans=max(query(2*x,l,r),query(2*x+1,l,r));
return ans;
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>a[i];
buildtree(1,1,n);
for(int i=1; i<=m; i++) {
char pd;
int x,y;
cin>>pd;
if(pd=='Q') {
cin>>x>>y;
cout<<query(1,x,y)<<endl;
} else {
cin>>x>>y;
update(1,x,x,y);
}
}
return 0;
}