1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; int tmax[maxn<<2], tmin[maxn<<2]; // 最大值,最小值 long long tsum[maxn<<2]; // 和 #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 void push_up(int rt) { // 用更新过的两个子节点信息来更新当前节点信息 tmax[rt] = max(tmax[rt<<1], tmax[rt<<1|1]); tmin[rt] = min(tmin[rt<<1], tmin[rt<<1|1]); tsum[rt] = tsum[rt<<1] + tsum[rt<<1|1]; } void build(int l, int r, int rt) { if (l == r) { scanf("%d", tmax + rt); tmin[rt] = tsum[rt] = tmax[rt]; return; } int mid = (l + r) / 2; build(lson); build(rson); push_up(rt); } // 将 a[p] 修改为 x void update(int p, int x, int l, int r, int rt) { if (l == r) { tmax[rt] = tmin[rt] = tsum[rt] = x; return; } int mid = (l + r) / 2; (p <= mid) ? update(p, x, lson) : update(p, x, rson); push_up(rt); } int query_max(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) // 区间完全被覆盖 return tmax[rt]; int res = 0, mid = (l + r) / 2; if (L <= mid) res = max(res, query_max(L, R, lson)); if (R > mid) res = max(res, query_max(L, R, rson)); return res; } int query_min(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) // 区间完全被覆盖 return tmin[rt]; int res = 1e9, mid = (l + r) / 2; if (L <= mid) res = min(res, query_min(L, R, lson)); if (R > mid) res = min(res, query_min(L, R, rson)); return res; } long long query_sum(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) // 区间完全被覆盖 return tsum[rt]; long long res = 0; int mid = (l + r) / 2; if (L <= mid) res += query_sum(L, R, lson); if (R > mid) res += query_sum(L, R, rson); return res; } int n, q, op, x, y; int main() { scanf("%d", &n); build(1, n, 1); scanf("%d", &q); while (q--) { scanf("%d%d%d", &op, &x, &y); if (op == 1) update(x, y, 1, n, 1); else if (op == 2) printf("%d\n", query_max(x, y, 1, n, 1)); else if (op == 3) printf("%d\n", query_min(x, y, 1, n, 1)); else printf("%lld\n", query_sum(x, y, 1, n, 1)); } return 0; }
- 1
信息
- ID
- 26
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者