#include<bits/stdc++.h>
using namespace std;
#define maxn 4000005
int root[maxn];
void pushup(int x)
{
root[x]=max(root[x<<1],root[x<<1|1]);
}
void build(int x,int l,int r){
if (l==r) {
scanf("%d",&root[x]);return;}
int m=(l+r)>>1;
build(x<<1,l,m);
build(x<<1|1,m+1,r);
pushup(x);
}
void update(int p,int q,int x,int l,int r)
{
if (l==r)
{
root[x]=q;//printf("root[p]=%d",root[p]);
return;
}
int m=(l+r)>>1;
if (p<=m)
update(p,q,x<<1,l,m);
else
update(p,q,x<<1|1,m+1,r);
pushup(x);
}
int getmax(int L,int R,int x,int l,int r){
if (L<=l&&r<=R) {
//printf("[]=%d\n",root[x]);
return root[x];
}
int m=(l+r)>>1;
int ans=0;
if (L<=m)
ans=max(ans,getmax(L,R,x<<1,l,m));
if (R>m)
ans=max(ans,getmax(L,R,(x<<1)|1,m+1,r));
// printf("ans=%d\n",ans);
return ans;
}
int main(){
int n,m,a,b,i;
char c[10];
while (~scanf("%d%d",&n,&m))
{
build(1,1,n);
int x,y;
for (int i=1;i<=m;i++)
{
scanf("%s%d%d",&c,&x,&y);
if (c[0]=='Q')
printf("%d\n",getmax(x,y,1,1,n));
else update(x,y,1,1,n);
}
}
return 0;
}
i hate it(单点修改,区间查询)
最新推荐文章于 2022-07-14 09:28:10 发布