ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lazy 세그
    템플릿 2022. 5. 2. 01:10

    https://www.acmicpc.net/problem/10999


    #include <bits/stdc++.h>
    using namespace std;
    #ifdef ONLINE_JUDGE
    constexpr bool local = false;
    #else
    constexpr bool local = true;
    #endif
    using ll = long long;
    ll n, m, k;
    vector<ll> a, segTree, lazy;
    void updateLazy(ll i, ll s, ll e) {
        if (lazy[i] != 0) {
            segTree[i] += (e - s + 1) * lazy[i];
            if (s != e) {
                lazy[i * 2] += lazy[i];
                lazy[i * 2 + 1] += lazy[i];
            }
            lazy[i] = 0;
        }
    }
    ll init(ll i, ll s, ll e) {
        if (s == e) return segTree[i] = a[s];
        ll mid = (s + e) / 2;
        return segTree[i] = init(i * 2, s, mid) + init(i * 2 + 1, mid + 1, e);
    }
    ll query(ll i, ll s, ll e, ll l, ll r) {
        updateLazy(i, s, e);
        if (l > e or r < s) return 0;
        if (l <= s and e <= r) return segTree[i];
        ll mid = (s + e) / 2;
        ll leftRes = query(i * 2, s, mid, l, r);
        ll rightRes = query(i * 2 + 1, mid + 1, e, l, r);
        return leftRes + rightRes;
    }
    void update(ll i, ll s, ll e, ll l, ll r, ll addVal) {
        updateLazy(i, s, e);
        if (e < l || r < s) return;
        if (l <= s && e <= r) {
            segTree[i] += (e - s + 1) * addVal;
            if (s != e) {
                lazy[i * 2] += addVal;
                lazy[i * 2 + 1] += addVal;
            }
            return;
        }
        ll mid = (s + e) / 2;
        update(i * 2, s, mid, l, r, addVal);
        update(i * 2 + 1, mid + 1, e, l, r, addVal);
        segTree[i] = segTree[i * 2] + segTree[i * 2 + 1];
    }
    int main(void) {
        if (!local) ios_base::sync_with_stdio(0), cin.tie(0);
        ll i, j;
        cin >> n >> m >> k;
        segTree.resize(n * 4);
        lazy.resize(n * 4);
        a.resize(n + 1);
        for (i = 1; i <= n; i++) cin >> a[i];
        init(1, 1, n);
        for (i = 0; i < m + k; i++) {
            ll op;
            cin >> op;
            if (op == 2) {
                ll A, B;
                cin >> A >> B;
                if (A > B) swap(A, B);
                cout << query(1, 1, n, A, B) << '\n';
            }
            if (op == 1) {
                ll A, B, C;
                cin >> A >> B >> C;
                update(1, 1, n, A, B, C);
            }
        }
        return 0;
    }

     

    '템플릿' 카테고리의 다른 글

    VSCode에서 <bits/stdc++.h> precompile header 사용  (0) 2024.09.28
    유니온파인드  (0) 2022.02.28
    LIS + 역추적  (0) 2022.02.04
    세그트리  (0) 2021.11.14

    댓글