一只蒟蒻前来求救
#include<bits/stdc++.h>
using namespace std;
int n,m,grade[200005],tree[2000100],ans=-0x3f;
void fbuild(int l,int r,int rt){
if(l==r){
tree[rt]=grade[l];
return;
}
int mid=(l+r)/2;
fbuild(l,mid,rt*2),fbuild(mid+1,r,rt*2+1);
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
return;
}
void change(int l,int r,int rt,int pos,int num){
if(l==r&&l==pos&&num>grade[pos]){
tree[rt]=num,grade[pos]=num;
return;
}
int mid=(l+r)/2;
if(mid+1<=pos){
change(mid+1,r,rt*2+1,pos,num);
}else if(pos<=mid){
change(l,mid,rt*2,pos,num);
}
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
return;
}
int quest(int l,int r,int L,int R,int rt){
if(L<=l&&r<=R){
return ans=tree[rt];
}
int mid=(l+r)/2;
if(L<=mid){
int tmp=quest(l,mid,L,R,rt*2),tmp2=ans;
ans=max(ans,tmp);
// printf("[L<=mid] (%d,%d) ans:%d=max(%d,%d)\n",l,r,ans,tmp2,tmp);
}
else if(mid<R){
int tmp=quest(mid+1,r,L,R,rt*2+1),tmp2=ans;
ans=max(ans,tmp);
// printf("[mid<R] (%d,%d) ans:%d=max(%d,%d)\n",l,r,ans,tmp2,tmp);
}
return ans;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&grade[i]);
}
fbuild(1,n,1);
// int cnt=1;
// while(tree[cnt]){
// printf("%d ",tree[cnt++]);
// } printf("\n");
while(m--){
char kind;int x,y;
cin>>kind>>x>>y;
if(kind=='Q'){
ans=-0x7f;
printf("%d\n",quest(1,n,x,y,1));
}else if(kind=='U'){
change(1,n,1,x,y);
// cnt=1;
// while(tree[cnt]){
// printf("%d ",tree[cnt++]);
// } printf("\n");
}
}
return 0;
}