Submission #646585

#TimeUsernameProblemLanguageResultExecution timeMemory
646585VanillaSum Zero (RMI20_sumzero)C++17
0 / 100
1 ms468 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int64; const int64 mod = 1e9 + 7; const int maxn = 1e3 + 2; int64 dp[maxn], down[maxn]; map <pair <int, int>, int64> c; int p[maxn]; vector <int> ad [maxn]; int n; void upd (int u) { vector <int64> d; down[u] = 0; dp[u] = 0; for (int v: ad[u]) { down[u] = max(down[u], down[v] + c[{u,v}]); d.push_back(down[v] + c[{u,v}]); } sort(d.rbegin(), d.rend()); for (int i = 0; i < min((int) d.size(), 2); i++) dp[u]+=d[i]; } void dfs (int u) { for (int v: ad[u]) { dfs(v); } upd(u); } int64 calc () { for (int i = 0; i < n; i++) dp[i] = 0; dfs(0); int64 rs = 0; for (int i = 0; i < n; i++){ rs+=dp[i]; } return rs % mod; } int main() { cin >> n; for (int i = 1; i <= n - 1; i++){ int x; cin >> x; ad[x].push_back(i); p[i] = x; } for (int i = 1; i <= n - 1; i++){ int x; cin >> x; c[{p[i], i}] = x; } if (n <= 1000) { cout << calc() << "\n"; int q; cin >> q; while (q--) { int64 x,y; cin >> x >> y; c[{p[x], x}] += y; cout << calc() << "\n"; } } else { p[0] = -1; int64 rs = 0; for (int i = 0; i < n; i++){ rs = (rs + dp[i]) % mod; } cout << rs << "\n"; int q; cin >> q; while (q--) { int64 x,y; cin >> x >> y; c[{p[x], x}]+=y; x = p[x]; while (x != -1) { // cout << q << " " << x << " " << dp[x] << "\n"; rs-=dp[x]; upd(x); rs+=dp[x]; rs%=mod; x = p[x]; } rs = (rs + mod) % mod; cout << rs << "\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...