线段树,区间查询, 点修改
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 200000 + 20;
int n,a[maxn],maxv[maxn<<2],cas,x,y,m;
char s[10];
void build(int rt,int L,int R){
if(L == R){
maxv[rt] = a[L];
return ;
}
int mid = (L+R)/2;
build(rt<<1,L,mid);
build(rt<<1|1,mid+1,R);
maxv[rt] = max(maxv[rt<<1] , maxv[rt<<1|1]);
}
void update(int rt,int L,int R,int x,int y){
if(L == R) {
maxv[rt] = y;
return ;
}
int mid = (L+R)/2;
if(x<=mid) update(rt<<1,L,mid,x,y);
else update(rt<<1|1,mid+1,R,x,y);
maxv[rt] = max(maxv[rt<<1] , maxv[rt<<1|1]);
}
int query(int rt,int L,int R,int x,int y){
if(x<=L&&R<=y) return maxv[rt];
int n1=0,n2=0;
int mid = (L+R)/2;
if(x<=mid) n1 = query(rt<<1,L,mid,x,y);
if(y>mid) n2 = query(rt<<1|1,mid+1,R,x,y);
return max(n1,n2);
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i = 1;i<=n;i++)
scanf("%d",a+i);
build(1,1,n);
while(m--){
scanf("%s",s);
scanf("%d%d",&x,&y);
if(s[0] == 'Q') printf("%d\n",query(1,1,n,x,y));
else update(1,1,n,x,y);
}
}
return 0;
}