Untitled

 avatar
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