#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int D = 40;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, md;
cin >> n >> md;
vector<vector<int>> g(n);
for (int i = 0; i < n - 1; ++i) {
int x, y;
cin >> x >> y;
x--; y--;
g[x].push_back(y);
g[y].push_back(x);
}
for (int i = 0; i < D; ++i) {
g.push_back({n - 1});
g[n - 1].push_back({n});
n++;
}
vector<int> par(n, -1);
function<void(int, int)> dfs = [&] (int x, int p) {
for (auto y: g[x]) {
if (y != p) {
dfs(y, x);
par[y] = x;
}
}
};
dfs(n - 1, -1);
vector<vector<ll>> f(n, vector<ll>(D + 1, 1));
for (int i = 0; i < n - D; ++i) {
int x;
cin >> x;
f[i][0] = x;
}
int q;
cin >> q;
while (q--) {
int t;
cin >> t;
if (t == 1) {
int x, d, w;
cin >> x >> d >> w;
x--;
while (d >= 0) {
f[x][d] = (f[x][d] * w) % md;
// if (d) f[x][d - 1] = (f[x][d - 1] * w) % md;
d--;
x = par[x];
}
} else {
int x;
cin >> x;
x--;
ll res = 1;
for (int d = 0; d <= D; ++d) {
res *= f[x][d];
res %= md;
if (d + 1 <= D) res *= f[x][d + 1];
if (res >= md) res %= md;
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... |