Submission #1204513

#TimeUsernameProblemLanguageResultExecution timeMemory
1204513irmuunMagic Tree (CEOI19_magictree)C++20
100 / 100
102 ms38896 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const ll N=1e5+5;

ll n,m,k;
vector<ll>g[N];
ll p[N],u[N],d[N],w[N];
vector<ll>day(N,0),pt(N,0);
map<ll,ll>dp[N];

void solve(ll i){
    for(ll j:g[i]){
        solve(j);
        if(dp[j].size()>dp[i].size()){
            swap(dp[i],dp[j]);
        }
        for(auto x:dp[j]){
            dp[i][x.ff]+=x.ss;
        }
    }
    if(day[i]>0){
        dp[i][day[i]]+=pt[i];
        while(true){
            auto it=dp[i].upper_bound(day[i]);
            if(it==dp[i].end()) break;
            ll x=(it->ff);
            if((it->ss)<=pt[i]){
                pt[i]-=(it->ss);
                dp[i].erase(it->ff);
            }
            else{
                dp[i][it->ff]-=pt[i];
                break;
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>n>>m>>k;
    for(ll i=2;i<=n;i++){
        cin>>p[i];
        g[p[i]].pb(i);
    }
    for(ll i=0;i<m;i++){
        cin>>u[i]>>d[i]>>w[i];
        day[u[i]]=d[i];
        pt[u[i]]=w[i];
    }
    solve(1);
    ll ans=0;
    for(auto x:dp[1]){
        ans+=x.ss;
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...