题目描述
解题思路
支持两种操作:
1) 区间最值查询
2) 单点更新
这题跟 HDU 1166 敌兵布阵 是类似的思路.
参考代码
#include <stdio.h>
#define lson rt<<1
#define rson rt<<1|1
#define mid ((l+r) >> 1)
inline int max(int a, int b){return a>b?a:b;}
const int MAX_N = 200010;
int score[MAX_N << 2];
void pushup(int rt){
score[rt] = max(score[lson], score[rson]);
}
void build(int l, int r, int rt){
if (l == r){
scanf("%d", &score[rt]);
return ;
}
build(l, mid, lson);
build(mid+1, r, rson);
pushup(rt);
}
void update(int k, int grade, int l, int r, int rt){
if (l == r){
score[rt] = grade;
return ;
}
if (k <= mid) update(k, grade, l, mid, lson);
else update(k, grade, mid+1, r, rson);
pushup(rt);
}
int query(int L, int R, int l, int r, int rt){
if (L <= l && r <= R){
return score[rt];
}
int ans = 0;
if (L <= mid) ans = max(ans, query(L, R, l, mid, lson));
if (R > mid) ans = max(ans, query(L, R, mid+1, r, rson));
return ans;
}
int main(){
int n, m, a, b;
char c;
while (~scanf("%d %d", &n, &m)){
build(1, n, 1);
while (m--){
scanf(" %c %d %d", &c, &a, &b);
if (c == 'Q'){
printf("%d\n", query(a, b, 1, n, 1));
}else{
update(a, b, 1, n, 1);
}
}
}
return 0;
}