제출 #1117765

#제출 시각아이디문제언어결과실행 시간메모리
1117765Zero_OPSprinkler (JOI22_sprinkler)C++14
100 / 100
1022 ms71856 KiB
#include <bits/stdc++.h>

using namespace std;

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

#ifdef LOCAL
    freopen("task.inp", "r", stdin);
    freopen("task.out", "w", stdout);
#endif // LOCAL

    int N, L;
    cin >> N >> L;
    vector<vector<int>> adj(N + 41);
    for(int i = 1; i < N; ++i){
        int u, v;
        cin >> u >> v;
        --u, --v;
        u += 41;
        v += 41;
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }

    for(int i = 1; i <= 41; ++i){
         adj[i - 1].emplace_back(i);
    }

    vector<int> H(N + 41), par(N + 41, -1);
    for(int i = 0; i < N; ++i) cin >> H[i + 41];
    vector<vector<int>> f(41, vector<int>(N + 41, 1));

    function<void(int, int)> dfs = [&](int u, int p){
        for(int v : adj[u]) if(v != p){
            par[v] = u;
//            cout << v << " : " << u << '\n';
            dfs(v, u);
        }
    };

    dfs(0, -1);

    int Q;
    cin >> Q;
    while(Q--){
        int type;
        cin >> type;
        if(type == 1){
            int x, d, w;
            cin >> x >> d >> w;
            --x;
            x += 41;
            for(int i = d; i >= 0; --i){
                assert(x != -1);
                f[i][x] = 1LL * f[i][x] * w % L;
//                cout << "update : " << i << ' ' << x - 41 << " : " << f[i][x] << '\n';
                if(i > 0) f[i - 1][x] = 1ll * f[i - 1][x] * w % L;
                x = par[x];
            }
//            cout << '\n';
        } else{
            int x; cin >> x;
            --x;
            x += 41;
            int res = H[x];
            for(int i = 0; i <= 40; ++i){
                assert(x != -1);
//                cout << i << " - " << x - 41 << " -> " << f[i][x] << '\n';
                res = 1LL * res * f[i][x] % L;
                x = par[x];
            }

            cout << res << '\n';
        }
    }

    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...