线段树 单点修改 区间求最大
#include <stdio.h> #define sc(x) scanf("%lld", &(x)) #define pr(x) printf("%lld\n", (x)) #define max(a, b) ((a) > (b) ? (a) : (b)) #define int ll typedef long long ll; const int N = 2e5 + 7; const ll mod = 1e9 + 7; int a[N], tree[N << 2], n; void bulid(int p = 1, int l = 1, int r = n) { if (l == r) { tree[p] = a[l]; return; } int mid = (l + r) / 2; bulid(p * 2, l, mid); bulid(p * 2 + 1, mid + 1, r); tree[p] = max(tree[p * 2], tree[p * 2 + 1]); } void upd(int p, int l, int r, int x, int num) { if (l == r) { if (l == x) tree[p] = num; return; } int mid = (l + r) / 2; if (x <= mid) upd(p * 2, l, mid, x, num); else upd(p * 2 + 1, mid + 1, r, x, num); tree[p] = max(tree[p * 2], tree[p * 2 + 1]); } int query(int p, int l, int r, int x, int y) { if (x <= l && r <= y) return tree[p]; int mid = (l + r) / 2; if (y <= mid) return query(p * 2, l, mid, x, y); if (x > mid) return query(p * 2 + 1, mid + 1, r, x, y); int La = query(p * 2, l, mid, x, mid), Ra = query(p * 2 + 1, mid + 1, r, mid + 1, y); return max(La, Ra); } signed main() { int m, x, y; char op; while (~sc(n) && ~sc(m)) { for (int i = 1; i <= n; ++i) sc(a[i]); bulid(); while (m--) { getchar(), op = getchar(); sc(x), sc(y); if (op == 'Q') pr(query(1, 1, n, x, y)); else upd(1, 1, n, x, y); } } return 0; }
算法竞赛之路 文章被收录于专栏
整理、记录算法竞赛的好题