#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 time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |