#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<map<int,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]);
}
}
vector<vector<int>> adjP;
void findPar(int v, int p, int fp){
if(v != p) {
adj[v].push_back(p);
adj[p].push_back(v);
}
if(fruits[v].second != 0){
p = v;
}
for(auto u : adjP[v]){
if(u == fp){
continue;
}
findPar(u ,p,v);
}
}
int32_t main(){
cin >> n >> m >> k;
adj.resize(n);
fruits.resize(n);
map<int,int> rp;
vector<int> par(n);
vector<int> in(n);
adjP.resize(n);
for(int i = 1; i < n; i++){
int p;
cin >> p;
p--;
adjP[i].push_back(p);
adjP[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);
}
#pragma region coordinate compression
times.insert(0);
vector<int> sorted(times.begin(),times.end());
map<int,int> toInd;
for(int i = 0; i < sorted.size(); i++){
toInd[sorted[i]] = i;
}
for(int i = 0; i < n; i++){
fruits[i].first = toInd[fruits[i].first];
}
k = toInd.size();
#pragma endregion
findPar(0,0,0);
dp.resize(k+1);
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... |