#include <bits/stdc++.h>
using namespace std;
#define N lli(2e6)
#define heps(v) v.begin(), v.end()
typedef long long int lli;
typedef std::vector<lli> vlli;
typedef pair<lli, lli> plli;
typedef pair<lli, plli> pplli;
typedef std::vector<plli> vplli;
typedef set<lli> slli;
typedef map<lli, lli> mlli;
lli n, t, k, q, m;
string str;
vlli vect;
vlli gr[N];
plli diz[N];
lli par[N];
priority_queue<plli> Q;
void dfs(lli v){
if(par[v] != 0)
return;
par[v] = -1;
diz[v].first += vect[v];
diz[v].second = min(diz[v].second, diz[v].first);
if(diz[v].first >= 0){
Q.push({diz[v].second, v});
return;
}
for(lli go: gr[v]){
par[go]--;
diz[go].second = min(diz[go].second, diz[v].second);
diz[go].first += diz[v].first;
dfs(go);
}
}
int main()
{
cin >> n >> k;
lli kilk = k;
vect.push_back(0);
for(lli i = 1;i<=n;i++){
cin >> m >> q;
vect.push_back(m);
if(q > 0){
gr[q].push_back(i);
par[i]++;
}
}
for(lli i = 1;i<=n;i++)
dfs(i);
while(!(Q.empty()) && (-Q.top().first <= k)){
plli su = Q.top();
Q.pop();
k += diz[su.second].first;
for(lli go:gr[su.second]){
par[go]--;
dfs(go);
}
}
cout << (k - kilk) << 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |