Submission #1297562

#TimeUsernameProblemLanguageResultExecution timeMemory
1297562MisterReaperArboras (RMI20_arboras)C++20
11 / 100
5094 ms7924 KiB
// File C.cpp created on 01.12.2025 at 09:17:42
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int md = int(1E9) + 7;

int N;
std::vector<int> P;
std::vector<i64> D;
std::vector<std::vector<int>> adj;
std::vector<i64> H;

void dfs(int v) {
    H[v] = 0;
    for (auto u : adj[v]) {
        dfs(u);
        H[v] = std::max(H[v], H[u] + D[u]);
    }
}

void solve() {
    dfs(0);
    int ans = 0;
    for (int v = 0; v < N; ++v) {
        i64 mx1 = 0, mx2 = 0;
        for (auto u : adj[v]) {
            if (H[u] + D[u] >= mx1) {
                mx2 = mx1;
                mx1 = H[u] + D[u];
            } else if (H[u] + D[u] >= mx2) {
                mx2 = H[u] + D[u];
            }
        }
        ans = (ans + mx1 + mx2) % md;
    }
    std::cout << ans << '\n';
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::cin >> N;

    P.resize(N);
    D.resize(N);
    H.resize(N);
    adj.resize(N);

    for (int i = 1; i < N; ++i) {
        std::cin >> P[i];
        adj[P[i]].emplace_back(i);
    }
    for (int i = 1; i < N; ++i) {
        std::cin >> D[i];
    }

    solve();

    int Q;
    std::cin >> Q;

    while (Q--) {
        int V, X;
        std::cin >> V >> X;
        D[V] += X;
        solve();
    }

    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...