题解:本题主要考查线段树(求区间最大值)。比较裸,套两个模板即可区间查询单点更新。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=800000+2;
struct tree
{
int l,r,mx;
}t[MAXN];
int a[MAXN];
int n,m;
void build(int x,int l,int r){
t[x].l=l;
t[x].r=r;
if(l==r){
t[x].mx=a[l];
return;
}
build(x*2,l,(l+r)>>1);
build(x*2+1,1+((l+r)>>1),r);
t[x].mx=max(t[x*2].mx,t[x*2+1].mx);
}
void change(int x,int l,int r,int k){
if(t[x].l>=l && t[x].r<=r){
t[x].mx=max(t[x].mx,k);
return;
}
if(t[x].l>r||t[x].r<l) return;
change(x*2,l,r,k);
change(x*2+1,l,r,k);
t[x].mx=max(t[x*2].mx,t[x*2+1].mx);
}
int ask(int x,int l,int r){
if(t[x].l>=l && t[x].r<=r) return t[x].mx;
if(t[x].l>r||t[x].r<l) return 0;
int ans=0;
ans=max(ask(2*x,l,r),ask(2*x+1,l,r));
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
char pd;
int x,y;
cin>>pd;
if(pd=='Q'){cin>>x>>y;cout<<ask(1,x,y)<<endl;}
else{cin>>x>>y;change(1,x,x,y);}
}
return 0;
}