Submission #576256

#TimeUsernameProblemLanguageResultExecution timeMemory
576256erekleSprinkler (JOI22_sprinkler)C++17
100 / 100
2128 ms72740 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAX_D = 40; int n; vector<vector<int>> g; vector<int> parent; void dfs(int i) { for (int j : g[i]) { if (!parent[j]) parent[j] = i, dfs(j); } } int main() { int l; cin >> n >> l; g.resize(1+n); for (int i = 1; i < n; ++i) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } parent.resize(1+n); parent[1] = -1; dfs(1); parent[1] = 0; vector<int> h(1+n); for (int i = 1; i <= n; ++i) cin >> h[i]; vector<vector<int>> multiplyDown(1+n, vector<int>(1+MAX_D, 1)); // all nodes distance j below node i need to be multiplied by multiplyDown[i][j] int q; cin >> q; while (q--) { int t, x; cin >> t >> x; if (t == 1) { int d, w; // we do not want same node to be multiplied by multiple ancestors // so every node will only be multiplied by the highest node that can multiply it for (cin >> d >> w; d >= 0 && x; --d, x = parent[x]) { multiplyDown[x][d] = (long long)multiplyDown[x][d] * w % l; if (d) multiplyDown[x][d-1] = (long long)multiplyDown[x][d-1] * w % l; if (!parent[x]) { for (int k = d-2; k >= 0; --k) { multiplyDown[x][k] = (long long)multiplyDown[x][k] * w % l; } } } } else { int v = h[x]; for (int d = 0; d <= MAX_D && x; ++d, x = parent[x]) { v = (long long)v * multiplyDown[x][d] % l; } cout << v << endl; } } return 0; }
#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...