#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
int n, m, k;
vector<pii> fruits;
vector<vector<int>> adj;
vector<vector<int>> dp;
void DFS(int v, int p){
    for(auto u : adj[v]){
        if(u == p) continue;
        DFS(u,v);
    }
    for(int t = 1; t <= k; t++){
        int s = 0;
        for(auto u : adj[v]){
            s += dp[t][u];
        }
        int add = 0;
        if(t == fruits[v].first){
            add += fruits[v].second;
        }
        dp[t][v] = max(s + add, dp[t-1][v]);
    }
}
int32_t main(){
    cin >> n >> m >> k;
    adj.resize(n);
    fruits.resize(n);
    for(int i = 1; i < n; i++){
        int p;
        cin >> p;
        p--;
        adj[i].push_back(p);
        adj[p].push_back(i);
    }
    set<int> times;
    for(int i = 0; i <m; i++){
        int v, d, w;
        cin >> v >> d >>w;
        v--;
        fruits[v] = {d,w};
        times.insert(d);
    }
    vector<int> sorted(times.begin(),times.end());
    map<int,int> toInd;
    for(int i = 0; i < n; i++){
        toInd[sorted[i]] = i;
    }
    for(int i = 0; i < n; i++){
        if(toInd.count(fruits[i].second)){
            fruits[i].second = toInd[fruits[i].second];
        }
    }
    dp.resize(k+1, vector<int>(n));
    DFS(0,0);
    cout << dp[k][0] << endl;
}
| # | 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... |