#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,k;
cin >> n >> m >> k;
vector<vector<int>> adj(n+1);
for(int i=2;i<=n;i++){
int p;cin>>p;
adj[p].emplace_back(i);
}
vector<int> w(n+1);
vector<int> d(n+1);
for(int i=1;i<=m;i++){
int v,dd,ww;cin>>v>>dd>>ww;
w[v]=ww;
d[v]=dd;
}
auto combine = [&](map<int,int> &a,map<int,int> &b){
if(a.size()<b.size())swap(a,b);
for(auto[i,j]:b){
a[i]+=j;
}
};
function<map<int,int>(int)> dfs = [&](int x){
map<int,int> DP;
for(int&i:adj[x]){
auto t = dfs(i);
combine(DP,t);
}
if(d[x]){ // is a fruit
DP[d[x]]+=w[x];
auto iter = DP.upper_bound(d[x]);
while(iter!=DP.end() and w[x]){
int trans = min(iter->second,w[x]);
w[x]-=trans;
iter->second-=trans;
if(iter->second==0)iter=DP.erase(iter);
else break;
}
}
return DP;
};
auto ans = dfs(1);
int anss = 0;
for(auto[i,j]:ans)anss+=j;
cout << anss << '\n';
}
# | 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... |