Submission #597275

#TimeUsernameProblemLanguageResultExecution timeMemory
597275Hacv16Arboras (RMI20_arboras)C++17
24 / 100
5010 ms106872 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int MAX = 2e6 + 15; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; #define pb push_back #define sz(x) (int) x.size() #define fr first #define sc second #define mp make_pair #define all(x) x.begin(), x.end() #define dbg(x) cout << #x << ": " << "[ " << x << " ]\n" ll n, q, p[MAX], wg[MAX], dp[MAX][2], use[MAX][2], ans; vector<int> adj[MAX], weight[MAX]; void dfs(int u){ for(int i = 0; i < sz(adj[u]); i++){ int v = adj[u][i], w = weight[u][i]; dfs(v); if(dp[v][0] + w > dp[u][0]){ dp[u][1] = dp[u][0]; dp[u][0] = dp[v][0] + w; use[u][1] = use[u][0]; use[u][0] = v; }else if(dp[v][0] + w > dp[u][1]){ dp[u][1] = dp[v][0] + w; use[u][1] = v; } } ans += dp[u][0] + dp[u][1]; ans %= MOD; } void update(int u, int x){ //Update the tree and answer wg[u] += x; while(u != 0){ if(use[p[u]][0] == u){ ans += dp[u][0] + wg[u] - dp[p[u]][0]; dp[p[u]][0] = dp[u][0] + wg[u]; }else if(dp[u][0] + wg[u] > dp[p[u]][0]){ ans += dp[p[u]][0] - dp[p[u]][1] + dp[u][0] + wg[u] - dp[p[u]][0]; dp[p[u]][1] = dp[p[u]][0]; use[p[u]][0] = use[p[u]][1]; dp[p[u]][0] = dp[u][0] + wg[u]; use[p[u]][0] = u; }else if(dp[u][0] + wg[u] > dp[p[u]][1]){ ans += dp[u][0] + wg[u] - dp[p[u]][1]; dp[p[u]][1] = dp[u][0] + wg[u]; use[p[u]][1] = u; } ans %= MOD; u = p[u]; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i = 1; i < n; i++){ cin >> p[i]; adj[p[i]].pb(i); } for(int i = 1; i < n; i++){ cin >> wg[i]; weight[p[i]].pb(wg[i]); } dfs(0); cout << ans << '\n'; cin >> q; while(q--){ int u, add; cin >> u >> add; update(u, add); cout << ans << '\n'; } 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...