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 Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;
const int N = 200'010, D = 42;
vector<int> A[N];
int par[N];
ll op[N][D];
ll ini[N];
int n, l;
void dfs(int v, int p)
{
	par[v] = p;
	for (int u : A[v]) {
		if (u != p)
			dfs(u, v);
	}
}
void do_op(int v, int d, int w)
{
	if (par[v] == -1) {
		Loop (i,0,d+1)
			op[v][i] = op[v][i] * w % l;
		return;
	}
	if (d == 0) {
		op[v][0] = op[v][0] * w % l;
		return;
	}
	op[v][d] = op[v][d] * w % l;
	op[v][d-1] = op[v][d-1] * w % l;
	do_op(par[v], d-1, w);
}
ll get(int v)
{
	int d = 0;
	ll x = ini[v] % l;
	while (v != -1 && d < D) {
		x = x * op[v][d] % l;
		v = par[v];
		d++;
	}
	return x;
}
int main()
{
	Loop (i,0,N) Loop (j,0,D)
		op[i][j] = 1;
	cin.tie(0) -> sync_with_stdio(false);
	cin >> n >> l;
	Loop (i,1,n) {
		int v, u;
		cin >> v >> u;
		--v; --u;
		A[v].push_back(u);
		A[u].push_back(v);
	}
	dfs(0, -1);
	Loop (i,0,n)
		cin >> ini[i];
	int q;
	cin >> q;
	while (q--) {
		int t;
		cin >> t;
		if (t == 1) {
			int x, d, w;
			cin >> x >> d >> w;
			do_op(x-1, d, w);
		} else {
			int x;
			cin >> x;
			cout << get(x-1) << '\n';
		}
	}
}
| # | 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... |