Cod sursa(job #45498)
#include <cstdio>
#include <algorithm>
using namespace std;
const char iname[] = "mese.in";
const char oname[] = "mese.out";
#define MAX_N 131072
int * adj[MAX_N];
int deg[MAX_N];
int P[MAX_N], V[MAX_N], n, s;
int Q[MAX_N];
int sef;
int Res;
void read_in(void) {
scanf("%d", & n);
scanf("%d", & s);
for (int i = 1; i <= n; ++ i)
scanf("%d %d", P + i, V + i), deg[P[i]] ++;
}
void graph(void) {
for (int i = 0; i <= n; ++ i)
adj[i] = new int[deg[i]], deg[i] = 0;
for (int i = 1; i <= n; ++ i)
adj[P[i]][deg[P[i]] ++] = i;
for (int i = 1; i <= n; ++ i)
if (P[i] == 0) sef = i;
}
int cmp(int z, int w) { return V[z] > V[w]; }
int work(const int i) {
int res = 0;
sort(adj[i], adj[i] + deg[i], cmp);
for (int j = 0; V[i] > s; ++ j)
V[i] -= V[adj[i][j]], res ++;
V[P[i]] += V[i];
return res;
}
int main(void)
{
freopen(iname, "r", stdin);
read_in();
graph();
int head, tail;
for (Q[head = tail = 0] = sef; head <= tail; ++ head) {
int i = Q[head];
for (int j = 0; j < deg[i]; ++ j)
Q[++ tail] = adj[i][j];
}
for (int i = n; i --; Res = Res + work(Q[i]))
;
freopen(oname, "w", stdout);
printf("%d\n", Res + 1);
return 0;
}