#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define sp <<" "<<
#define endl "\n"
void solve() {
ll n, MOD; cin >> n >> MOD;
vector<vector<int>> adj(n + 42);
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v; u--, v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
// cali4d nodes
// permitir suficiente padres
for (int i = n; i < n + 42; i++) {
adj[i].push_back(i-1);
adj[i-1].push_back(i);
}
// ! no senora no puedo mas !
// ok wtf am i doing
vector<vector<ll>> mul(n + 42, vector<ll>(43, 1LL));
for(int i = 0; i < n; i++) cin >> mul[i][0];
vector<int> par(n + 42, -1);
auto dfs = [&](auto &&dfs, int u, int p) -> void {
for (auto &v : adj[u]) {
if (v != p) {
par[v] = u;
dfs(dfs, v, u);
}
}
};
// arise
// ...or smth
// aura farmer ahh sung jinwoo
dfs(dfs, n + 41, -1);
ll q; cin >> q;
while (q--) {
ll type; cin >> type;
if (type == 1) {
ll x, d, w; cin >> x >> d >> w; x--;
ll at = x;
while (d >= 0) {
mul[at][d] = (mul[at][d] * w) % MOD; // nrm !(d&1)
if (d) mul[at][d-1] = (mul[at][d-1] * w) % MOD; // par (d&1)
at = par[at];
// cerr << at << endl;
d--;
}
} else {
ll x; cin >> x; x--;
ll res = 1, d = 40, at = x;
while (d >= 0) {
// cerr << at+1 sp mul[at][40 - d] << endl;
res = (res * mul[at][40 - d]) % MOD;
at = par[at];
d--;
}
cout << res << endl;
}
}
}
signed main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
int t = 1;
// cin >> t;
while (t--)
solve();
}
# | 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... |