真检查不出错误。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
using namespace std;
using ll = long long;
const int kMaxN = 2e5 + 20, kInf = (((1 << 30) - 1) << 1) + 1;
const ll kLInf = 9.22e18;
int n, m, a[kMaxN], tree[kMaxN];
int lowbit(int x) {return (x & (-x));}
void Update(int x, int val) {
for (; x <= n; x += lowbit(x)) {
tree[x] = val;
for (int i = 1; i < lowbit(x); i <<= 1) {
tree[x] = max(tree[x], tree[x - i]);
}
}
}
int Query(int l, int r) {
int ans = 0;
for (; l <= r; ) {
ans = max(ans, a[r]);
-- r;
for (; r - l >= lowbit(r); ) {
ans = max(ans, tree[r]);
r -= lowbit(r);
}
}
return ans;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++ i) {
cin >> a[i];
Update(i, a[i]);
}
char op;
int A, b;
for (; m; -- m) {
cin >> op;
if (op == 'Q') {
cin >> A >> b;
cout << Query(A, b) << '\n';
} else {
cin >> A >> b;
a[A] = b;
Update(A, b);
}
}
return 0;
}