恩这个是求区间最大值,是把敌兵布阵那道题的update函数改了一下,
ps : a >?= b == a = max(a, b);
#include <stdio.h>
const int maxn = 200010;
int sum[maxn * 4];
void PushUP(int rt) {
sum[rt] = sum[rt * 2] > sum[rt * 2 + 1] ? sum[rt * 2] : sum[rt * 2 + 1];
}
void build(int l, int r, int rt) {
if (l == r) {
scanf("%d", &sum[rt]);
return ;
}
int m = (l + r) / 2;
build(l, m, rt * 2);
build(m + 1, r, rt * 2 + 1);
PushUP(rt);
}
void update(int p, int add, int l, int r, int rt) {
if (l == r) {
sum[rt] = add;
return ;
}
int m = (l + r) / 2;
if (p <= m) update(p, add, l, m, rt * 2);
else update(p, add, m + 1, r, rt * 2 + 1);
PushUP(rt);
}
int query(int L, int R, int l, int r, int rt) {
if (L <= l && R >= r) {
return sum[rt];
}
int m = (l + r) / 2;
int ret = 0;
if (L <= m) ret >?= query(L, R, l, m, rt * 2);
if (R > m) ret >?= query(L, R, m + 1, r, rt * 2 + 1);
return ret;
}
int main() {
int n;
while(scanf("%d", &n) == 1) {
int m;
scanf("%d", &m);
build(1, n, 1);
for(int i = 0; i < m; i++) {
char op;
getchar();
scanf("%c", &op);
int a, b;
scanf("%d%d", &a, &b);
if (op == 'Q'){
printf("%d\n", query(a, b, 1, n, 1));
}
else {
update(a, b, 1, n, 1);
}
}
}
return 0;
}