#include<bits/stdc++.h>
using namespace std;
int a[100001],n,m,x,y,ans;
string op;
int tree[400004];
inline void build(int k,int ll,int rr){
if(ll==rr){
tree[k]=a[ll];
return;
}
int m=(ll+rr)/2;
build(k*2,ll,m);
build(k*2+1,m+1,rr);
tree[k]=max(tree[k*2],tree[k*2+1]);
}
inline void change_point(int k,int ll,int rr,int x,int y){
if(ll==rr){
if(tree[k]<y) tree[k]=y;
return;
}
int m=(ll+rr)/2;
if(x<=m) change_point(k*2,ll,m,x,y);
else change_point(k*2+1,m+1,rr,x,y);
tree[k]=max(tree[k*2],tree[k*2+1]);
}
int ask_interval(int k,int ll,int rr,int x,int y){
if(x<=ll&&rr<=y) return tree[k];
int m=(ll+rr)/2,ans=-1e9;
if(x<=m) ans=max(ans,ask_interval(k*2,ll,m,x,y));
if(y>m) ans=max(ans,ask_interval(k*2+1,m+1,rr,x,y));
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>op;
if(op=="Q"){
scanf("%d%d",&x,&y);
printf("%d\n",ask_interval(1,1,n,x,y));
}
else{
scanf("%d%d",&x,&y);
change_point(1,1,n,x,y);
}
}
return 0;
}
还有一个问题,区间询问的 ans 变量改到 m 的赋值后面就可以对一些点,但如果重开一行就不行,这是为何?