Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 Input 本题目包含多组测试,请处理到文件结束。 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 cinAuthor linle |
#include<bits/stdc++.h>
using namespace std;
const int Maxx= 1<<19;
const int Maxn=2e6+10;
struct NODE
{
int value;
int l,r;
}node[Maxx];
int father[Maxn];
void build(int i,int l,int r)
{
node[i].l=l;
node[i].r=r;
node[i].value=0;
if(l==r){
father[l]=i;
return;
}
build(i<<1,l,(int)(floor(l+r)/2.0));
build((i<<1)+1,(int)(floor(l+r)/2.0)+1,r);
}
void update(int ri)
{
if(ri==1) return;
int fi=ri/2;
int a=node[fi<<1].value;
int b=node[(fi<<1)+1].value;
node[fi].value=max(a,b);
update(ri/2);
}
int Max;
void query(int i,int l,int r)
{
if(node[i].l==l&&node[i].r==r){
Max=max(Max,node[i].value);
return ;
}
i=i<<1;
if(l<=node[i].r){
if(r<=node[i].r) query(i,l,r);
else query(i,l,node[i].r);
}
i++;
if(r>=node[i].l){
if(l>=node[i].l) query(i,l,r);
else query(i,node[i].l,r);
}
}
int main()
{
int n,m;
int g;
ios::sync_with_stdio(false);
while(cin>>n>>m){
build(1,1,n);
for(int i=1;i<=n;i++){
cin>>g;
node[father[i]].value=g;
update(father[i]);
}
string op;
int a,b;
while(m--){
cin>>op>>a>>b;
if(op[0]=='Q'){
Max=0;
query(1,a,b);
cout<<Max<<endl;
}
else{
node[father[a]].value=b;
update(father[a]);
}
}
}
return 0;
}