#include <bits/stdc++.h>
#define fr first
#define sc second
#define psb push_back
#define ppb pop_back
#define ps push
#define pp pop
#define sz size
#define em empty
#define tp top
#define ft front
#define ll long long
using namespace std;
int main(){
//input graph n shi
int n; ll l; cin >> n >> l;
vector <int> graph[n + 1];
for(int i = 1, u, v; i <= n - 1; i++){
cin >> u >> v;
graph[u].psb(v); graph[v].psb(u);
}
ll h[n + 1]; for(int i = 1; i <= n; i++) cin >> h[i];
//set multiplier
ll mul[n + 1][41]; for(int i = 1; i <= n; i++) for(int j = 0; j <= 40; j++) mul[i][j] = 1;
//set roots
int root[n + 1] = {0};
queue <pair <int, int>> qu; for(int i = 0; i < graph[1].sz(); i++) qu.ps({graph[1][i], 1});
while(!qu.em()){
int p = qu.ft().sc, c = qu.ft().fr;
root[c] = p;
for(int i = 0; i < graph[c].sz(); i++){
if(graph[c][i] != p){
qu.ps({graph[c][i], c});
}
}
qu.pp();
}
//process shit
int q; cin >> q;
while(q--){
int t; cin >> t;
if(t == 1){
int x, d; ll w; cin >> x >> d >> w;
//go root
h[x] *= w;
h[x] %= l;
while(d > 0 && x != root[x]){
mul[x][d] *= w;
mul[x][d - 1] *= w;
d--;
h[root[x]] *= w;
x = root[x];
}
}else if(t == 2){
int x, d = 1; cin >> x; ll tot = h[x];
x = root[x];
//go root
while(x != root[x]){
tot *= mul[x][d];
tot %= l;
x = root[x];
d++;
}
// cout << '>';
cout << tot % l << endl;
}
}
}
# | 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... |