提出 #74880123


ソースコード 拡げる

#include <bits/stdc++.h>
#define endl '\n'

using namespace std;
using i64 = long long;

struct PersistentSegTree {
    struct Node {
        i64 sum;
        int l, r;
    };

    int n, tot;
    vector<Node> tr;

    PersistentSegTree() {}
    PersistentSegTree(int n, int maxNode) {
        init(n, maxNode);
    }

    void init(int _n, int maxNode) {
        n = _n;
        tot = 0;
        tr.assign(maxNode + 1, {0, 0, 0});
    }

    int clone(int p) {
        tr[++tot] = tr[p];
        return tot;
    }

    int modify(int p, int l, int r, int pos, int val) {
        int u = clone(p);
        if (l == r) {
            tr[u].sum = val;
            return u;
        }

        int mid = (l + r) >> 1;
        if (pos <= mid) {
            tr[u].l = modify(tr[p].l, l, mid, pos, val);
        } else {
            tr[u].r = modify(tr[p].r, mid + 1, r, pos, val);
        }

        tr[u].sum = tr[tr[u].l].sum + tr[tr[u].r].sum;
        return u;
    }

    i64 query(int p, int l, int r, int ql, int qr) {
        if (!p) {
            return 0;
        }
        if (ql <= l && r <= qr) {
            return tr[p].sum;
        }

        int mid = (l + r) >> 1;
        i64 res = 0;
        if (ql <= mid) {
            res += query(tr[p].l, l, mid, ql, qr);
        }
        if (qr > mid) {
            res += query(tr[p].r, mid + 1, r, ql, qr);
        }
        return res;
    }

    int modify(int root, int pos, int val) {
        return modify(root, 1, n, pos, val);
    }

    i64 query(int root, int l, int r) {
        return query(root, 1, n, l, r);
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m, q;
    cin >> n >> m >> q;

    PersistentSegTree seg(m, (q + 5) * 25);

    vector<int> root(n + 1, 0);

    while (q--) {
        int op;
        cin >> op;

        if (op == 1) {
            int x, y;
            cin >> x >> y;
            root[x] = root[y];
        } else if (op == 2) {
            int x, y, z;
            cin >> x >> y >> z;
            root[x] = seg.modify(root[x], y, z);
        } else {
            int x, l, r;
            cin >> x >> l >> r;
            cout << seg.query(root[x], l, r) << endl;
        }
    }

    return 0;
}

提出情報

提出日時
問題 G - Copy Query
ユーザ NoobDidi
言語 C++23 (GCC 15.2.0)
得点 600
コード長 2330 Byte
結果 AC
実行時間 79 ms
メモリ 82340 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 1
AC × 26
セット名 テストケース
Sample sample_01.txt
All evil_01.txt, evil_02.txt, evil_03.txt, evil_04.txt, evil_05.txt, sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt
ケース名 結果 実行時間 メモリ
evil_01.txt AC 72 ms 82260 KiB
evil_02.txt AC 76 ms 82232 KiB
evil_03.txt AC 75 ms 82280 KiB
evil_04.txt AC 76 ms 82260 KiB
evil_05.txt AC 79 ms 82336 KiB
sample_01.txt AC 1 ms 3484 KiB
test_01.txt AC 1 ms 3588 KiB
test_02.txt AC 1 ms 3520 KiB
test_03.txt AC 1 ms 3444 KiB
test_04.txt AC 47 ms 81500 KiB
test_05.txt AC 52 ms 81540 KiB
test_06.txt AC 52 ms 81540 KiB
test_07.txt AC 57 ms 81492 KiB
test_08.txt AC 57 ms 81500 KiB
test_09.txt AC 59 ms 81488 KiB
test_10.txt AC 59 ms 81488 KiB
test_11.txt AC 60 ms 82260 KiB
test_12.txt AC 60 ms 82324 KiB
test_13.txt AC 60 ms 82268 KiB
test_14.txt AC 58 ms 81764 KiB
test_15.txt AC 58 ms 81872 KiB
test_16.txt AC 61 ms 82316 KiB
test_17.txt AC 69 ms 82136 KiB
test_18.txt AC 67 ms 82340 KiB
test_19.txt AC 62 ms 82308 KiB
test_20.txt AC 68 ms 82276 KiB