I Hate It
http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树区间最大值,单点修改,区间查询。
code
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 200005;
int tree[N << 2];
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
void push_up(int root) { tree[root] = max(tree[ls(root)], tree[rs(root)]); }
void build_tree(int l, int r, int root) {
if (l == r) {
scanf("%d", &tree[root]);
return;
}
int mid = (l + r) >> 1;
build_tree(l, mid, ls(root));
build_tree(mid + 1, r, rs(root));
push_up(root);
}
int query(int l, int r, int root, int L, int R) {
if (L <= l && r <= R) {
return tree[root];
}
int mid = (l + r) >> 1;
int res = 0;
if (L <= mid) res = max(res, query(l, mid, ls(root), L, R));
if (mid < R) res = max(res, query(mid + 1, r, rs(root), L, R));
return res;
}
// 单点修改
void update(int l, int r, int root, int pos, int val) {
if (l == pos && r == pos) {
tree[root] = val;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) update(l, mid, ls(root), pos, val);
else update(mid + 1, r, rs(root), pos, val);
push_up(root);
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
memset(tree, 0, sizeof(tree));
build_tree(1, n, 1);
while (m--) {
char c[5];
int x, y;
scanf("%s%d%d", c, &x, &y);
if (c[0] == 'Q') {
printf("%d\n", query(1, n, 1, x, y));
} else {
update(1, n, 1, x, y);
}
}
}
return 0;
}