样例都过不去 Orz
#include <iostream>
#define lc (o << 1)
#define rc (o << 1 | 1)
using namespace std;
const int S = 2e5 + 5;
int n, q;
int a[S], mx[4 * S];
void pushup(int o) {
mx[o] = max(mx[lc], mx[rc]);
return;
}
void build(int o, int l, int r) {
if (l == r) {
mx[l] = a[l];
return;
}
int mid = l + r >> 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(o);
}
void update(int o, int l, int r, int p, int v) {
if (l == r) {
mx[o] = max(mx[o], v);
return;
}
int mid = l + r >> 1;
if (p <= mid) {
update(lc, l, mid, p, v);
}
if (mid < p) {
update(rc, mid + 1, r, p, v);
}
pushup(o);
}
int query(int o, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
return mx[o];
}
int mid = l + r >> 1;
int ans = -1;
if (ql <= mid) {
ans = max(ans, query(lc, l, mid, ql, qr));
}
if (mid < qr) {
ans = max(ans, query(rc, mid + 1, r, ql, qr));
}
return ans;
}
int main() {
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
char op; int a, b;
while (q--) {
cin >> op >> a >> b;
if (op == 'Q') {
cout << query(1, 1, n, a, b) << endl;
} else {
update(1, 1, n, a, b);
}
}
return 0;
}