Submission #1225774

#TimeUsernameProblemLanguageResultExecution timeMemory
1225774Ghulam_JunaidArboras (RMI20_arboras)C++20
24 / 100
5094 ms16344 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 10, LG = 17, mod = 1e9 + 7; int n, par[N][LG], q, mx[N][2]; ll d[N], dep[N], val[N], ans; vector<int> g[N]; void dfs(int v){ for (int u : g[v]){ dfs(u); dep[v] = max(dep[v], dep[u] + d[u]); if (d[mx[v][1]] + dep[mx[v][1]] < d[u] + dep[u]) mx[v][1] = u; if (d[mx[v][0]] + dep[mx[v][0]] < d[mx[v][1]] + dep[mx[v][1]]) swap(mx[v][0], mx[v][1]); } val[v] = d[mx[v][0]] + dep[mx[v][0]] + d[mx[v][1]] + dep[mx[v][1]]; ans += val[v]; ans %= mod; } void upd(int u){ if (!u) return; int v = par[u][0]; int prv = val[v]; ans -= val[v]; if (mx[v][0] == u) val[v] = d[mx[v][0]] + dep[mx[v][0]] + d[mx[v][1]] + dep[mx[v][1]]; else if (mx[v][1] == u){ val[v] = d[mx[v][0]] + dep[mx[v][0]] + d[mx[v][1]] + dep[mx[v][1]]; if (d[mx[v][0]] + dep[mx[v][0]] < d[mx[v][1]] + dep[mx[v][1]]) swap(mx[v][0], mx[v][1]); } else{ if (d[mx[v][1]] + dep[mx[v][1]] < d[u] + dep[u]) mx[v][1] = u; if (d[mx[v][0]] + dep[mx[v][0]] < d[mx[v][1]] + dep[mx[v][1]]) swap(mx[v][0], mx[v][1]); val[v] = d[mx[v][0]] + dep[mx[v][0]] + d[mx[v][1]] + dep[mx[v][1]]; } ans += val[v]; ans %= mod; ans += mod; ans %= mod; dep[v] = max(dep[v], dep[u] + d[u]); if (val[v] > prv) upd(v); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i < n; i ++) cin >> par[i][0], g[par[i][0]].push_back(i); for (int i = 1; i < n; i ++) cin >> d[i]; for (int v = 0; v < n; v ++) mx[v][0] = mx[v][1] = n; dfs(0); cout << ans << '\n'; cin >> q; while (q--){ int v, x; cin >> v >> x; d[v] += x; upd(v); cout << ans << '\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...