제출 #1345847

#제출 시각아이디문제언어결과실행 시간메모리
1345847MisterReaperSprinkler (JOI22_sprinkler)C++20
100 / 100
398 ms96572 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG
    #include "debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int K = 41;

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, L;
    std::cin >> N >> L;
    std::vector<std::vector<int>> adj(N);
    for (int i = 1; i < N; ++i) {
        int A, B;
        std::cin >> A >> B;
        --A, --B;
        adj[A].emplace_back(B);
        adj[B].emplace_back(A);
    }

    std::vector<i64> H(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> H[i];
    }

    std::vector<int> par(N, -1);
    auto dfs = [&](auto&& self, int v) -> void {
        for (auto u : adj[v]) {
            adj[u].erase(std::find(adj[u].begin(), adj[u].end(), v));
            par[u] = v;
            self(self, u);
        }
    };
    dfs(dfs, 0);

    std::vector<std::array<i64, K>> wei(N);
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < K; ++j) {
            wei[i][j] = 1;
        }
    }

    auto mul = [&](i64 a, i64 b) -> i64 {
        return (a * b) % L;
    };

    int Q;
    std::cin >> Q;
    while (Q--) {
        int TP;
        std::cin >> TP;
        if (TP == 1) {
            int X, D, W;
            std::cin >> X >> D >> W;
            --X;
            while (X != 0 && D >= 0) {
                wei[X][D] = mul(wei[X][D], W);
                if (--D == -1) {
                    break;
                } else if (X == 0) {
                    break;
                } else {
                    wei[X][D] = mul(wei[X][D], W);
                    X = par[X];
                }
            }
            while (D >= 0) {
                wei[X][D] = mul(wei[X][D], W);
                D--;
            }
        } else {
            int X;
            std::cin >> X;
            --X;
            i64 ans = H[X];
            for (int i = 0; X != -1 && i < K; ++i, X = par[X]) {
                ans = mul(ans, wei[X][i]);
            }
            std::cout << ans << '\n';
        }
        // #ifdef DEBUG
        //     for (int i = 0; i < N; ++i) {
        //         debug(i, wei[i]);
        //     }
        //     debug();
        // #endif
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...