1 条题解
-
-2
#include <bits/stdc++.h> using namespace std; struct SegTree { std::vector<long long> tree; std::vector<long long> lazy; int n; std::vector<long long> org; void init(vector<long long> &a) { n = a.size(); tree.resize(4 * n + 1); lazy.resize(4 * n + 1); org = a; build(1, 1, n - 1); } void build(int node, int l, int r) { if (l == r) { tree[node] = org[l]; return; } int mid = (l + r) / 2; build(node * 2, l, mid); build(node * 2 + 1, mid + 1, r); tree[node] = tree[node * 2] + tree[node * 2 + 1]; } void maintain(int p, int cl, int cr) { int cm = cl + (cr - cl) / 2; if (cl != cr && lazy[p]) { lazy[p * 2] += lazy[p]; lazy[p * 2 + 1] += lazy[p]; tree[p * 2] += lazy[p] * (cm - cl + 1); tree[p * 2 + 1] += lazy[p] * (cr - cm); lazy[p] = 0; } } void update(int node, int l, int r, int ql, int qr, long long val) { if (ql > r || qr < l) { return; } if (ql <= l && qr >= r) { tree[node] += val * (r - l + 1); lazy[node] += val; return; } maintain(node, l, r); int mid = (l + r) / 2; update(node * 2, l, mid, ql, qr, val); update(node * 2 + 1, mid + 1, r, ql, qr, val); tree[node] = tree[node * 2] + tree[node * 2 + 1]; } long long query(int node, int l, int r, int ql, int qr) { if (ql > r || qr < l) { return 0; } if (ql <= l && qr >= r) { return tree[node]; } maintain(node, l, r); int mid = (l + r) / 2; long long ll = query(node * 2, l, mid, ql, qr); long long rr = query(node * 2 + 1, mid + 1, r, ql, qr); return ll + rr; } } tree; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int n, q; std::cin >> n >> q; std::vector<long long> a(n + 1); for (int i = 1; i <= n; i++) { std::cin >> a[i]; } tree.init(a); while (q--) { int op; std::cin >> op; if (op == 1) { int l, r, val; std::cin >> l >> r >> val; tree.update(1, 1, n, l, r, val); } else { int l, r; std::cin >> l >> r; std::cout << tree.query(1, 1, n, l, r) << '\n'; } } return 0; }
- 1
信息
- ID
- 2431
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 31
- 已通过
- 11
- 上传者