Untitled
unknown
plain_text
a year ago
2.4 kB
7
Indexable
#include <bits/stdc++.h> using namespace std; struct segTree { vector<long long> seg; vector<long long> lazy; long long n, init; segTree(int _n, long long initELEMENT) { n = 1, init = initELEMENT; while (n < _n) n <<= 1; seg.assign(2 * n, {initELEMENT}); lazy.assign(2 * n, {initELEMENT}); } long long calc(long long x, long long y) { return x + y; } void addToLazy(int u, long long sz, long long val) { lazy[u] += val; } void pushToSEG(int u, long long sz) { seg[u] += lazy[u] * sz; if (u < n) for (int i = 0; i < 2; ++i) lazy[u * 2 + i] += lazy[u]; lazy[u] = 0; } void pull(int u, long long sz) { if (u < n) seg[u] = calc(seg[u * 2], seg[u * 2 + 1]); } void update(int l, int r, long long val) { update(1, 0, n - 1, l, r, val); } void update(int u, int L, int R, int l, int r, long long val) { pushToSEG(u, R - L + 1); if (R < l || L > r) return; if (L >= l && R <= r) { addToLazy(u, R - L + 1, val); pushToSEG(u, R - L + 1); return; } int M = (L + R) / 2; update(u * 2, L, M, l, r, val); update(u * 2 + 1, M + 1, R, l, r, val); pull(u, R - L + 1); } long long query(int l, int r) { return query(1, 0, n - 1, l, r); } long long query(int u, int L, int R, int l, int r) { pushToSEG(u, R - L + 1); if (L > r || R < l) return init; if (L >= l && R <= r) { return seg[u]; } int M = (L + R) / 2; long long resL = query(u * 2, L, M, l, r); long long resR = query(u * 2 + 1, M + 1, R, l, r); return calc(resL, resR); } }; int main () { int n, q; cin >> n >> q; segTree seg(n, 0); for (int i = 0; i < n; ++i) { int x; cin >> x; seg.update(i, i, x); } for (int i = 0; i < q; ++i) { int ty; cin >> ty; if (ty == 1) { long long l, r, val; cin >> l >> r >> val; --l, --r; seg.update(l, r, val); } else { int k; cin >> k; --k; cout << seg.query(k, k) << "\n"; } } }
Editor is loading...
Leave a Comment