分析:基础的点更新,区间查询最值的线段树
#include<cstdio>
#include<cstring>
#define lson l, m, i<<1
#define rson m + 1, r, i<<1|1
const int maxn = 200000 + 10;
int sum[maxn<<2];
/****************************
使用全局变量,可以减少函数参数
*****************************/
int ql, qr, p, v;
/***********************
*******max函数**********
***********************/
int max(int a, int b){
return a > b ? a : b;
}
/***********************
*******求区间最值********
区间最大值等于左右区间最大
值中较大的一个。
************************/
void PushUP(int i){
sum[i] = max(sum[i<<1], sum[i<<1|1]);
}
/************************
**********建树***********
*************************/
void build(int l, int r, int i){
if(l == r){
scanf("%d", &sum[i]);
return ;
}
int m = (l + r)>>1;
build(lson);
build(rson);
PushUP(i);
}
/*******************************
**************更新***************
********************************/
void update(int l, int r, int i){
int m = (l + r)>>1;
if(l == r)
sum[i] = v;
else{
if(p <= m) update(lson);
else update(rson);
PushUP(i);
}
}
/*********************************
************查询******************
*********************************/
int query(int l, int r, int i){
int m = (l + r)>>1;
int ans = -1;
if(ql <= l && r <= qr) return sum[i];
if(ql <= m) ans = max(ans, query(lson));
if(m < qr) ans = max(ans, query(rson));
return ans;
}
int main(){
int n, m;
char str[10];
while(~scanf("%d%d", &n, &m)){
build(1, n, 1);
for(int i = 0; i < m; i++){
scanf("%s", str);
if(str[0] == 'U'){
scanf("%d%d", &p, &v);
update(1, n, 1);
}
else{
scanf("%d%d", &ql, &qr);
printf("%d\n", query(1, n, 1));
}
}
}
return 0;
}