提出 #74871997


ソースコード 拡げる

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define compress(v) sort(all(v)), v.erase(unique(all(v)), v.end())
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
template<typename Node, typename F> struct SegTree {
    int n, size;
    Node e; // 항등원
    vector<Node> tree;
    F func;
    SegTree(int n, const Node& e, F func) : n(n), size(1<<(__lg(n)+1)), e(e), tree(size<<1, e), func(func) {}
    SegTree(const vector<Node>& v, const Node& e, F func) : n(sz(v)), size(1<<(__lg(n)+1)), e(e), tree(size<<1, e), func(func) {
        for (int i = 0; i < n; i++) tree[i+size] = v[i];
        for (int i = size-1; i > 0; i--) tree[i] = func(tree[i<<1], tree[i<<1 | 1]);
    }
    void update(int i, const Node& val) {
        tree[i += size] = val;
        while (i >>= 1) {
            tree[i] = func(tree[i<<1], tree[i<<1 | 1]);
        }
    }
    Node query(int i) { return tree[i + size]; }
    Node query(int l, int r) {
        Node L = e, R = e;
        for (l += size, r += size; l <= r; l >>= 1, r >>= 1) {
            if (l & 1) L = func(L, tree[l++]);
            if (~r & 1) R = func(tree[r--], R);
        }
        return func(L, R);
    }
};
int main() {
    fastio; int N, M, Q; cin >> N >> M >> Q;
    vector<int> ver(N+1); int vc = 0;
    vector<vector<array<int,3>>> adj(Q+1), qv(Q+1);
    int q = 0;
    for (int i = 0; i < Q; i++) {
        int a, x, y; cin >> a >> x >> y;
        if (a == 1) {
            ver[x] = ver[y];
        }
        else if (a == 2) {
            int z; cin >> z;
            adj[ver[x]].push_back({ ++vc, y, z });
            ver[x] = vc;
        }
        else {
            int z; cin >> z;
            qv[ver[x]].push_back({ q++, y, z });
        }
    }
    vector<ll> ans(q);
    SegTree sg(M, (ll)0, [](ll a, ll b) { return a+b; });
    auto dfs = [&](auto dfs, int u) -> void {
        for (auto [id, l, r] : qv[u]) {
            ans[id] = sg.query(l, r);
        }
        for (auto [v, y, z] : adj[u]) {
            ll t = sg.query(y);
            sg.update(y, z);
            dfs(dfs, v);
            sg.update(y, t);
        }
    };
    dfs(dfs, 0);
    for (auto i : ans) cout << i << "\n";
    return 0;
}

提出情報

提出日時
問題 G - Copy Query
ユーザ Lov34ever
言語 C++23 (GCC 15.2.0)
得点 600
コード長 2368 Byte
結果 AC
実行時間 80 ms
メモリ 48872 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 63 ms 29892 KiB
evil_02.txt AC 62 ms 31348 KiB
evil_03.txt AC 65 ms 31432 KiB
evil_04.txt AC 67 ms 31380 KiB
evil_05.txt AC 80 ms 31384 KiB
sample_01.txt AC 1 ms 3432 KiB
test_01.txt AC 1 ms 3528 KiB
test_02.txt AC 1 ms 3596 KiB
test_03.txt AC 1 ms 3496 KiB
test_04.txt AC 39 ms 24996 KiB
test_05.txt AC 42 ms 16624 KiB
test_06.txt AC 43 ms 16592 KiB
test_07.txt AC 51 ms 16232 KiB
test_08.txt AC 51 ms 16092 KiB
test_09.txt AC 56 ms 16340 KiB
test_10.txt AC 58 ms 16344 KiB
test_11.txt AC 58 ms 20064 KiB
test_12.txt AC 58 ms 20056 KiB
test_13.txt AC 58 ms 20048 KiB
test_14.txt AC 56 ms 17816 KiB
test_15.txt AC 58 ms 19860 KiB
test_16.txt AC 62 ms 48872 KiB
test_17.txt AC 57 ms 29084 KiB
test_18.txt AC 57 ms 29512 KiB
test_19.txt AC 51 ms 28652 KiB
test_20.txt AC 57 ms 29136 KiB