#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;
const int N = 3e5 + 9;
vi adj[N];
ll x[N];
int p[N];
struct Element {
ll sum, mini;
int first;
Element(ll a, ll b, int c) : sum(a), mini(b), first(c) {}
bool operator<(const Element &o) const {
if (mini != o.mini) return mini < o.mini;
return sum > o.sum;
}
};
priority_queue<Element> pq[N];
void dfs(int u) {
for (int v : adj[u]) {
dfs(v);
if (sz(pq[v]) > sz(pq[u])) {
swap(pq[u], pq[v]);
}
while (!pq[v].empty()) {
pq[u].push(pq[v].top());
pq[v].pop();
}
}
Element e = {x[u], min(x[u], 0LL), u};
while (!pq[u].empty() && (e.sum <= 0 || pq[u].top().mini >= e.mini)) {
e.mini = min(e.mini, e.sum + pq[u].top().mini);
e.sum += pq[u].top().sum;
pq[u].pop();
}
if (e.sum > 0) {
pq[u].push(e);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n; ll s;
cin >> n >> s;
forsn(i, 1, n + 1) {
cin >> x[i] >> p[i];
adj[p[i]].push_back(i);
}
dfs(0);
ll res = s;
while (!pq[0].empty()) {
auto e = pq[0].top(); pq[0].pop();
if (res + e.mini < 0) break;
res += e.sum;
}
cout << res - s << '\n';
return 0;
}
# | 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... |