Submission #778817

#TimeUsernameProblemLanguageResultExecution timeMemory
778817aZvezdaSprinkler (JOI22_sprinkler)C++14
100 / 100
930 ms102028 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#ifndef LOCAL
#define cerr if(false)cerr
#endif

const ll MAX_N = 2e5 + 10;
const ll MAX_D = 45;

ll cnt[MAX_N][MAX_D];
ll n;
ll L;
vector<ll> g[MAX_N];
ll par[MAX_N];
ll start[MAX_N];
	
void dfs(ll x, ll p) {
	par[x] = p;
	for(const auto it : g[x]) {
		if(it == p) { continue; }
		dfs(it, x);
	}
}

void upd(ll x, ll d, ll w) {
	if(d == 0) {
		cnt[x][d] = (cnt[x][d] * w) % L;
		return;
	}
	if(par[x] == 0) {
		upd(x, d - 1, w);		
		cnt[x][d] = (cnt[x][d] * w) % L;
	} else {
		upd(par[x], d - 1, w);
		cnt[x][d] = (cnt[x][d] * w) % L;
		cnt[x][d - 1] = (cnt[x][d - 1] * w) % L;
	}
}

ll ans(ll x) {
	ll ret = start[x];
	ll curr = x, d = 0;
	while(curr != 0 && d < MAX_D) {
		ret = (ret * cnt[curr][d]) % L;
		curr = par[curr];
		d ++;
	}
	return ret;
}

signed main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);

	cin >> n >> L;
	for(ll i = 0; i < n - 1; i ++) {
		ll a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	for(ll i = 1; i <= n; i ++) {
		cin >> start[i];
	}
	for(ll i = 0; i < MAX_N; i ++) {
		for(ll j = 0; j < MAX_D; j ++) {
			cnt[i][j] = 1;
		}
	}

	dfs(1, 0);
	ll q;
	cin >> q;
	while(q --) {
		ll t;
		cin >> t;
		if(t == 1) {
			ll x, d, w;
			cin >> x >> d >> w;
			upd(x, d, w);
		} else {
			ll x;
			cin >> x;
			cout << ans(x) << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...