Cod sursa(job #45498)

Utilizator MariusMarius Stroe Marius Data 1 aprilie 2007 16:25:02
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#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;
}