Submission #446195

#TimeUsernameProblemLanguageResultExecution timeMemory
446195Haruto810198Magic Tree (CEOI19_magictree)C++17
100 / 100
157 ms37268 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

#define FOR(i,l,r,d) for(int i=(l);i<=(r);i+=(d))
#define szof(x) ((int)(x).size())

#define vi vector<int>
#define pii pair<int,int>

#define F first
#define S second

#define pb push_back
#define eb emplace_back
#define mkp make_pair

const int INF = 2147483647;
const int LNF = INF*INF;
const int MOD = 1000000007;
const int mod = 998244353;
const double eps = 1e-12;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

const int MAX = 100010;

int n, m, k;
vi child[MAX];
int day[MAX], val[MAX];

map<int, int> dp[MAX];

void solve(int v){

    int Max_id = -1;
    int Max_sz = 0;

    for(int i : child[v]){
        solve(i);
        if( szof(dp[i]) > Max_sz ){
            Max_sz = szof(dp[i]);
            Max_id = i;
        }
    }

    if( Max_id != -1 ){
        swap(dp[v], dp[Max_id]);
    }

    /// dp[v] <- dp[i]
    for(int i : child[v]){
        for(auto it=dp[i].begin(); it!=dp[i].end(); it++){
            dp[v][it->F] += it->S;
        }
    }

    /// point add
    dp[v][day[v]] += val[v];

    int rem = val[v];
    auto it_begin = next(dp[v].find(day[v]));
    auto it_end = next(dp[v].find(day[v]));

    while( rem > 0 and it_end!=dp[v].end() ){

        if(rem >= it_end->S){
            rem -= it_end->S;
            //it_end->S = 0;
            it_end = next(it_end);
        }
        else{
            //it_end->S -= rem;
            break;
        }

    }

    dp[v].erase(it_begin, it_end);
    if( it_end != dp[v].end() ){
        dp[v][it_end->F] -= rem;
    }

    /*
    cerr<<"solve("<<v<<") : "<<endl;
    for(auto it=dp[v].begin(); it!=dp[v].end(); it++){
        cerr<<"["<<it->F<<", "<<it->S<<"] ";
    }
    cerr<<endl<<endl;
    */

}

signed main(){

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m>>k;

    FOR(i, 2, n, 1){
        int par;
        cin>>par;
        child[par].pb(i);
    }

    FOR(i, 1, n, 1){
        day[i] = 1;
        val[i] = 0;
    }

    FOR(i, 1, m, 1){
        int v;
        cin>>v;
        cin>>day[v]>>val[v];
    }

    solve(1);

    int res = 0;
    for(auto it=dp[1].begin(); it!=dp[1].end(); it++){
        res += it->S;
    }

    cout<<res<<'\n';

    return 0;

}
#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...