I Hate It - 洛谷https://www.luogu.com.cn/problem/P1531
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <unordered_map>
#include <cmath>
#include <map>
#include <cctype>
#include <cstdlib>
#include <deque>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1000010;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
int n, m;
int s[MAXN];
int tree[MAXN];
void build(int q = 1, int l = 1, int r = n) {
if (l == r) {
return void(tree[q] = s[l]);
}
int mid = l + r >> 1;
build(q << 1, l, mid);
build(q << 1 | 1, mid + 1, r);
tree[q] = max(tree[q << 1], tree[q << 1 | 1]);
}
void update(int x, int k, int q = 1, int l = 1, int r = n) {
if (l == r)
return void(tree[q] = k);
int mid = l + r >> 1;
//printf("====\n");
if (mid >= x)
update(x, k, q << 1, l, mid);
else
update(x, k, q << 1 | 1, mid + 1, r);
tree[q] = max(tree[q << 1], tree[q << 1 | 1]);
}
int query(int x, int y, int q = 1, int l = 1, int r = n) {
if (l >= x && r <= y)
return tree[q];
int mid = l + r >> 1;
int ans = 0;
if (mid >= x)
ans = max(ans, query(x, y, q << 1, l, mid));
if (mid < y)
ans = max(ans, query(x, y, q << 1 | 1, mid + 1, r));
return ans;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", s + i);
}
build();
char ch;
int x, y;
while (m--) {
scanf(" %c", &ch);
if (ch == 'Q') {
scanf("%d %d", &x, &y);
printf("%d\n", query(x, y));
} else {
scanf("%d %d", &x, &y);
if (s[x] < y) {
s[x] = y;
update(x, y);
}
}
}
return 0;
}