Submission #792102

#TimeUsernameProblemLanguageResultExecution timeMemory
792102quanlt206Sprinkler (JOI22_sprinkler)C++14
3 / 100
4090 ms183352 KiB
#include<bits/stdc++.h> #define X first #define Y second #define FOR(i, a, b) for (int i = (a); i <= (b); i++) #define FORD(i, b, a) for (int i = (b); i >= (a); i--) #define REP(i, a, b) for (int i = (a); i < (b); i++) #define MASK(x) (1LL << (x)) #define all(x) begin(x), end(x) using namespace std; typedef long long ll; typedef long double ld; typedef double db; typedef pair<int, int> pii; typedef pair<int, pii> piii; typedef pair<ll, ll> pll; typedef pair<ll, pll> plll; typedef pair<ll, int> pli; typedef pair<ll, pii> plii; template<class A, class B> bool maximize(A& x, B y) { if (x < y) return x = y, true; else return false; } template<class A, class B> bool minimize(A& x, B y) { if (x > y) return x = y, true; else return false; } /* END OF TEMPLATE */ const int N = 2e5 + 7; int n, L, P[N]; ll res[N][50], h[N], res2[N][50]; vector<int> v[N]; void dfs(int x, int par) { P[x] = par; for (auto y : v[x]) if (y != par) dfs(y, x); } void firstQuery() { int x, d, w; cin>>x>>d>>w; FOR(j, 0, d) res2[x][j] = res2[x][j] * w % L; int tmp = 0; while (x != -1 && tmp <= d) { res[x][d - tmp] = res[x][d - tmp] * w % L; tmp++; x = P[x]; } } void secondQuery() { int x; cin>>x; ll ans = h[x]; int tmp = 1; int last_x = x; // ans = ans * res2[x][0] % L; FOR(i, 0, 40) ans = ans * res[x][i] % L; x = P[x]; // cout<<res[2][1]<<"\n"; // cout <<x<<" "<<ans<<"\n"; while (x != -1 && tmp <= 40) { ans = ans * res2[x][tmp] % L; // cout<<x<<" "<<ans<<"\n"; // ans = ans * res[x][0] % L; if (tmp < 40) { for (auto y : v[x]) if (y != last_x && y != P[x]) { FOR(j, 0, 40) if (j >= tmp + 1) { ans = ans * res[y][j] % L; // cout<<y<<" "<<j<<" "<<res[y][j]<<"\n"; } } } // cout<<x<<" "<<ans<<"\n"; // break; last_x = x; x = P[x]; tmp++; } cout<<ans<<"\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>L; REP(i, 1, n) { int x, y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } FOR(i, 1, n) FOR(j, 0, 40) res[i][j] = res2[i][j] = 1; FOR(i, 1, n) cin>>h[i]; dfs(1, -1); int Q; cin>>Q; while (Q--) { int type; cin>>type; if (type == 1) firstQuery(); else secondQuery(); } 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...