Submission #1245166

#TimeUsernameProblemLanguageResultExecution timeMemory
1245166jasonicSprinkler (JOI22_sprinkler)C++20
100 / 100
736 ms103712 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)

ll n, MOD;
ll prods[200'005][50];
ll heights[200'005];
ll par[200'005];

vector<vector<int>> adjlist;

void dfs(int v, int p = -1) {
    par[v] = p;
    for(auto i : adjlist[v]) if(i != p) dfs(i, v);
}

int main() {
    fastIO;
    
    cin >> n >> MOD;
    adjlist = vector<vector<int>>(n);

    for(int i = 1; i < n; i++) {
        int a, b; cin >> a >> b; a--, b--;
        adjlist[a].push_back(b);
        adjlist[b].push_back(a);
    }

    dfs(0);

    for(int i = 0; i < n; i++) cin >> heights[i];
    for(int i = 0; i < n; i++) for(int j = 0; j <= 40; j++) prods[i][j] = 1ll;

    int Q; cin >> Q;

    for(int q = 0; q < Q; q++) {
        int t; cin >> t;
        if(t == 1) {
            ll x, d, w; cin >> x >> d >> w; x--;

            while(d >= 0) {
                prods[x][d] = (prods[x][d] * w) % MOD;

                if(x != 0 && d != 0) prods[x][d-1] = (prods[x][d-1] * w) % MOD;
                if(x != 0) x = par[x];
                
                d--;
            }
            
        } else {
            int x; cin >> x; x--;
            // query
            ll ans = heights[x];
            int node = x;

            for(int i = 0; i <= 40; i++) {
                ans = (ans * prods[node][i]) % MOD;
                node = par[node];
                if(node == -1) break;
            }

            printf("%lld\n", ans);
        }
    }
    
    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...