#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int, int>
#define sz(v) (int)v.size()
#define all(v) v.begin(), v.end()
using namespace std;
const int N=2e5+5, inf = 1e18;
int n, q, mod;
int pro[N][41], h[N], par[N];
vector<int> adj[N];
void dfs(int u, int p) {
    par[u] = p;
    for (int v: adj[u]) {
        if(v!=p) dfs(v, u);
    }
}
signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> mod;
    for (int i=1; i<n; i++) {
        int u, v; cin >> u >> v;
        adj[u].pb(v); adj[v].pb(u);
    }
    for (int i=1; i<=n; i++) {
        cin >> h[i];
        for (int j=0; j<=40; j++) pro[i][j] = 1;
    }
    dfs(1, 0);
    cin >> q;
    while(q--) {
        int t;
        cin >> t;
        if(t==1) {
            int x, d, w;
            cin >> x >> d >> w;
            while (d>=0 && x>0) {
                if(x==1) {
                    for (int i=d; i>=0; i--) pro[x][i] = pro[x][i]*w%mod;
                } else {
                    pro[x][d] = pro[x][d]*w%mod;
                    if(d>0) pro[x][d-1] = pro[x][d-1]*w%mod;
                }
                x = par[x];
                d--;
            }
        } else {
            int x; cin >> x;
            int ans = h[x];
            for (int i=0, u=x; i<=40 && u>0; i++, u = par[u]) ans = ans*pro[u][i]%mod;
            cout << ans << '\n';
        }
    }
}
| # | 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... |