Submission #589017

#TimeUsernameProblemLanguageResultExecution timeMemory
589017LastRoninSprinkler (JOI22_sprinkler)C++14
0 / 100
1323 ms126000 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> #define ll long long #define mp make_pair #define f first #define s second #define pb push_back #define pill pair<ll, ll> #define speed ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) using namespace std; const int N = 2e5 + 11; const ll hsh[2] = {1555555699, 1222222763}; const ll P = 113; mt19937_64 rofl(chrono::steady_clock::now().time_since_epoch().count()); ll n, L, q; vector<ll> g[N]; ll sz[N]; ll h[N]; int lay[N]; ll dist[N][20]; ll cp[N];// centroid predok bool del[N]; void dfs(ll v, ll p) { sz[v] = 1; for(auto u : g[v]) { if(p == u || del[u])continue; dfs(u, v); sz[v] += sz[u]; } } void bdfs(ll v, ll p, ll k) { cp[v] = k; if(p == k)dist[v][lay[k]] = 1; else dist[v][lay[k]] = dist[p][lay[k]] + 1; for(auto u : g[v]) { if(u == p || del[u])continue; bdfs(u, v, k); } } int fnd(int v) { int p = 0; int siz = sz[v]; while(p != v) { int c = v; for(auto u : g[c]) { if(u != p && !del[u] && sz[u] * 2ll > siz) { v = u; break; } } p = c; } return v; } void build(ll v, ll layer = 0) { dfs(v, 0); v = fnd(v); del[v] = 1; lay[v] = layer; for(auto u : g[v]) { if(!del[u]) bdfs(u, v, v); } for(auto u : g[v]) { if(!del[u]) { build(u, layer + 1); } } } int stp[N][41]; int per[N][41]; void upd(ll a, ll c, ll b) { ll dis = 0; ll izn = a; int cnt = 0; for(int j = c; j >= 0; j--) { stp[a][j]++; } while(a) { if(cp[a] == 0)break; cnt++; assert(cnt <= 40); dis = dist[izn][lay[cp[a]]]; if(c - dis >= 0) { for(int j = c - dis; j >= 0; j--) { stp[cp[a]][j]++; per[a][j]++; } } a = cp[a]; } } ll getans(ll a) { ll dis = 0; ll izn = a; ll ans = stp[a][0]; ll pr = a; a = cp[a]; while(a) { dis = dist[izn][lay[a]]; ans = ans + stp[a][dis] - per[pr][dis]; pr = a; a = cp[a]; } return ans; } ll prec[N * 3]; int main() { speed; cin >> n >> L; prec[0] = 1; for(int i = 1; i <= 500000; i++) prec[i] = prec[i - 1] * 2ll % L; for(int i = 1, a, b; i < n; i++) { cin >> a >> b; g[a].pb(b); g[b].pb(a); } for(int i = 1; i <= n; i++) { cin >> h[i]; } build(1); cin >> q; while(q--) { ll t, a, b, c; cin >> t >> a; if(t == 1) { cin >> b >> c; upd(a, b, c); } else { ll z = getans(a); cout << h[a] * prec[z] % L << "\n"; } } } /* 7 10 1 2 1 3 1 4 1 5 2 6 2 7 1 1 1 1 1 1 1 8 1 6 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 */
#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...