This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MX = 200005;
int n, m, k;
int d[MX];
int w[MX];
map<int, int> f[MX];
vector<int> G[MX];
void dfs(int u){
    for(int v: G[u]){
        dfs(v);
        if(f[v].size() > f[u].size()) swap(f[u], f[v]);
        for(pair<int, int> tmp: f[v]){
            f[u][tmp.first] += tmp.second;
        }
        f[v].clear();
    }
    if(d[u]){
        f[u][d[u]] += w[u];
        while(1){
            auto itr = f[u].upper_bound(d[u]);
            if(itr == f[u].end()) break;
            if(itr->second <= w[u]){
                w[u] -= itr->second;
                f[u].erase(itr);
            }
            else{
                itr->second -= w[u];
                break;
            }
        }
    }
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m >> k;
    for(int i=2; i<=n; i++){
        int p; cin >> p;
        G[p].push_back(i);
    }
    for(int i=1; i<=m; i++){
        int u; cin >> u;
        cin >> d[u] >> w[u];
    }
    dfs(1);
    int ans = 0;
    for(pair<int, int> tmp: f[1]) ans += tmp.second;
    cout << ans;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |