#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,s;
cin >> N >> s;
int back = s;
vector<vector<int>> adj(N+1);
vector<int> cost(N+1);
for(int i=1;i<=N;i++){
int p;
cin >> cost[i] >> p;
adj[p].emplace_back(i);
}
auto add = [&](pair<int,map<int,int>> &a,pair<int,map<int,int>> &b){
if(a.second.size()<b.second.size())swap(a,b);
for(auto&[x,y]:b.second){
a.second[x-b.first+a.first]+=y;
}
};
function<pair<int,map<int,int>>(int)> dfs = [&](int x){
pair<int,map<int,int>> curr = {0,{}};
if(cost[x]>=0){curr.second[0]=cost[x];}
for(int&i:adj[x]){
auto t = dfs(i);
add(curr,t);
}
if(cost[x]<0){
curr.first+=cost[x];
cost[x] = -cost[x];
while(!curr.second.empty()){
int trans = min(cost[x],curr.second.begin()->second);
curr.second.begin()->second-=trans;
cost[x]-=trans;
if(curr.second.begin()->second==0)curr.second.erase(curr.second.begin());
if(cost[x]==0)break;
}
}
return curr;
};
auto t = dfs(0);
while(!t.second.empty() and t.second.begin()->first<=s+t.first){
s+=t.second.begin()->second;
t.second.erase(t.second.begin());
}
cout << s-back << '\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... |