#include<bits/stdc++.h>
using namespace std;
long long dfs(long long x, long long l, vector<vector<pair<long long,long long>>> &AR, priority_queue<long long> &PQ)
{
    priority_queue<long long> temp;
    long long slope =0;
    if (AR[x].size()){
        for (long long i=0; i<AR[x].size(); i++)
        {
            slope+=dfs(AR[x][i].first, AR[x][i].second, AR, temp);
            if (temp.size()>PQ.size())swap(PQ, temp);
            while(!temp.empty())
            {
                PQ.push(temp.top());
                temp.pop();
            }
        }
        while(PQ.size()>slope+1)PQ.pop();
        long long bar1 = PQ.top()+l;
        PQ.pop();
        long long bar0 = PQ.top()+l;
        PQ.pop();
        PQ.push(bar0);
        PQ.push(bar1);
    }
    else
    {
        slope=1;
        PQ.push(l);
        PQ.push(l);
    }
    return slope;
}
int main()
{
    long long N, M;
    cin >> N >> M;
    N+=M;
    long long tot=0;
    vector<vector<pair<long long,long long>>> AR(N);
    for (long long i=1; i<N; i++)
    {
        long long x, d;
        cin >> x >> d;
        tot+=d;
        x--;
        AR[x].push_back({i, d});
    }
    priority_queue<long long> PQ;
    long long ans = dfs(0, 0, AR, PQ);
    PQ.pop();
    long long last = PQ.top();
    for (long long i=0; !PQ.empty(); i++)
    {
        tot-= i * (last-PQ.top());
        last = PQ.top();
        PQ.pop();
    }
    tot-=last*ans;
    cout << tot << 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... |