#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,mod;
vector <int> z[1000005];
int par[1000005];
int dp[250005][42];
void dfs(int i){
    for (auto p:z[i]){
         if (p==par[i]){
             continue;
         }
         par[p]=i;
         dfs(p);
    }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> mod;
    for (int i=1;i<a;i++){
         int x,y;
         cin >> x >> y;
         z[x].push_back(y);
         z[y].push_back(x);
    }
    dfs(1);
    for (int i=0;i<=a;i++){
         for (int j=1;j<=40;j++){
             dp[i][j]=1;
         }
    }
    for (int i=1;i<=a;i++){
         cin >> dp[i][0];
    }
    int q;
    cin >> q;
    while (q--){
         int c;
         cin >> c;
         if (c==1){
             int x,d,w;
             cin >> x >> d >> w;
             int cur = x;
for (int i = d; i >= 0; i--) {
    dp[cur][i] = dp[cur][i] * w % mod;
    if (i > 0) {
        dp[cur][i-1] = dp[cur][i-1] * w % mod;
    }
    if (par[cur]==0){
        for (int j=i-2;j>=0;j--){
             dp[cur][j]=dp[cur][j]* w % mod;
        }
        break;
    }
    cur = par[cur];
}
         }else{
             int x;
             cin >> x;
             int res=1;
             for (int i=0;i<=40;i++){
                  if (x==0){
                    break;
                  }
                  res=res*dp[x][i]%mod;
                  x=par[x];
             }
             cout << res << "\n";
         }
    }
    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... |