题面:
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
大致思路:
依然是一个裸的线段树,点修改+区间询问,不过要求和上一题不一样。这个题求的是区间最大值。
把树中存的数改成区间最大值就OK了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn],tree[maxn*4];
void build(int l,int r,int k)
{
if(l>r)
return ;
if(l==r){
tree[k]=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
tree[k]=max(tree[k*2],tree[k*2+1]);
}
void change(int pos,int x,int k,int l,int r)
{
if(l==r&&l==pos){
tree[k]=x;
return ;
}
int mid=(l+r)>>1;
if(pos<=mid)
change(pos,x,k*2,l,mid);
else
change(pos,x,k*2+1,mid+1,r);
tree[k]=max(tree[k*2],tree[k*2+1]);
}
int query(int l,int r,int ql,int qr,int k)
{
if(ql>r||qr<l)
return -1;
if(l>=ql&&r<=qr)
return tree[k];
int mid=(l+r)>>1;
int s1=query(l,mid,ql,qr,2*k);
int s2=query(mid+1,r,ql,qr,2*k+1);
return max(s1,s2);
}
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);//不关闭同步有可能超时,也可以直接用scanf
int n,m,x,y;
char cmd;
while(cin>>n>>m)
{
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,n,1);
while(m--)
{
cin>>cmd>>x>>y;
if(cmd=='Q')
cout<<query(1,n,x,y,1)<<endl;
else
change(x,y,1,1,n);
}
}
return 0;
}