This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define MAX 500005
#define MOD (ll)(1e9+7)
#define INF (ll)(1e18)
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
ll n, m, k, q, l, tt;
ll arr[MAX], par[MAX][41], dp[MAX][41];
vector<ll> graph[MAX];
void dfs(ll node, ll p) {
par[node][1] = p;
for(auto v : graph[node]) if(v != p) dfs(v, node);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> l;
for(ll i = 1; i <= n - 1; ++i) {
ll a, b; cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
for(ll i = 1; i <= n; ++i) cin >> arr[i];
for(ll i = 0; i <= n; ++i) for(ll k = 0; k <= 40; ++k) dp[i][k] = 1;
for(ll i = 0; i <= n; ++i) par[i][0] = i;
dfs(1, 0);
for(ll k = 2; k <= 40; ++k) for(ll i = 1; i <= n; ++i) par[i][k] = par[par[i][k - 1]][1];
cin >> q;
for(ll i = 1; i <= q; ++i) {
ll t; cin >> t;
if(t == 1) {
ll x, d, w; cin >> x >> d >> w;
for(ll i = 0; i <= d; ++i) {
dp[par[x][i]][d - i] = dp[par[x][i]][d - i] * w % l;
if(par[x][i] == 0) break;
}
}
else {
ll x; cin >> x;
ll ans = arr[x];
for(ll j = 0; j <= 40; ++j) {
if(par[x][j] == 0) {
for(ll k = j; k <= 40; ++k) ans = ans * dp[par[x][j]][k] % l;
break;
}
ans = ans * dp[par[x][j]][j] % l;
if(j < 40) ans = ans * dp[par[x][j]][j + 1] % l;
}
cout << ans << '\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... |