ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세그트리
    템플릿 2021. 11. 14. 09:37

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

     

    2042번: 구간 합 구하기

    첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄

    www.acmicpc.net

     

    ll update


    #include <bits/stdc++.h>
    using namespace std;
    #ifdef ONLINE_JUDGE
    constexpr bool local = false;
    #else
    constexpr bool local = true;
    #endif
    using ll = long long;
    using pi = pair<ll, ll>;
    ll n, m, k;
    vector<ll> a, segTree;
    ll init(ll i, ll s, ll e) {
        if (s == e) return segTree[i] = a[s];
        ll mid = (s + e) >> 1;
        return segTree[i] = init(2 * i, s, mid) + init(2 * i + 1, mid + 1, e);
    }
    ll update(ll i, ll s, ll e, ll idx, ll value) {
        if (e < idx || idx < s) return segTree[i];
        if (s == e) return segTree[i] = value;
        ll mid = (s + e) >> 1;
        return segTree[i] = update(2 * i, s, mid, idx, value) +
                            update(2 * i + 1, mid + 1, e, idx, value);
    }
    ll query(ll i, ll s, ll e, ll l, ll r) {
        if (e < l || r < s) return 0;
        if (l <= s && e <= r) return segTree[i];
        ll mid = (s + e) >> 1;
        return query(2 * i, s, mid, l, r) + query(2 * i + 1, mid + 1, e, l, r);
    }
    int main(void) {
        if (!local) ios_base::sync_with_stdio(0), cin.tie(0);
        cin >> n >> m >> k;
        a.resize(n + 1);
        segTree.resize(4 * n);
        int i;
        for (i = 1; i <= n; i++) cin >> a[i];
        init(1, 1, n);
        for (i = 1; i <= m + k; i++) {
            ll op;
            cin >> op;
            if (op == 1) {
                ll idx, val;
                cin >> idx >> val;
                update(1, 1, n, idx, val);
                a[idx] = val;
            } else if (op == 2) {
                ll S, E;
                cin >> S >> E;
                cout << query(1, 1, n, S, E) << '\n';
            }
        }
        return 0;
    }

     

     

    void update


     
    #include <bits/stdc++.h>
    using namespace std;
    #ifdef ONLINE_JUDGE
    constexpr bool local = false;
    #else
    constexpr bool local = true;
    #endif
    using ll = long long;
    using pi = pair<ll, ll>;
    ll n, m, k;
    vector<ll> a, segTree;
    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(2 * i, s, mid) + init(2 * i + 1, mid + 1, e);
    }
    void update(ll i, ll s, ll e, ll idx, ll diff) {
        if (e < idx || idx < s) return;
        segTree[i] += diff;
        if (s != e) {
            ll mid = (s + e) / 2;
            update(2 * i, s, mid, idx, diff);
            update(2 * i + 1, mid + 1, e, idx, diff);
        }
    }
    ll query(ll i, ll s, ll e, ll l, ll r) {
        if (e < l || r < s) return 0;
        if (l <= s && e <= r) return segTree[i];
        ll mid = (s + e) / 2;
        return query(2 * i, s, mid, l, r) + query(2 * i + 1, mid + 1, e, l, r);
    }
    int main(void) {
        if (!local) ios_base::sync_with_stdio(0), cin.tie(0);
        cin >> n >> m >> k;
        a.resize(n + 1);
        segTree.resize(4 * n);
        int i;
        for (i = 1; i <= n; i++) cin >> a[i];
        init(1, 1, n);
        for (i = 1; i <= m + k; i++) {
            ll op;
            cin >> op;
            if (op == 1) {
                ll idx, val;
                cin >> idx >> val;
                update(1, 1, n, idx, val - a[idx]);
                a[idx] = val;
            } else if (op == 2) {
                ll S, E;
                cin >> S >> E;
                cout << query(1, 1, n, S, E) << '\n';
            }
        }
        return 0;
    }

     

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

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

    댓글