Pagini recente » Cod sursa (job #1495883) | Cod sursa (job #450779) | Cod sursa (job #2640655) | Cod sursa (job #627947) | Cod sursa (job #45776)
Cod sursa(job #45776)
using namespace std;
#include <stdio.h>
#include <algorithm>
#define FIN "mese.in"
#define FOUT "mese.out"
#define NMAX 100001
#define INF 0x3f3f3f3f
int s[NMAX], sum[NMAX], age[NMAX], *f[NMAX];
int N, nr[NMAX], root, verif, S, ind[NMAX];
void read ()
{
int x, y;
scanf ("%d %d\n", &N, &S);
for (int i = 1; i <= N; ++ i)
{
scanf ("%d %d\n", &x, &y);
if (x != 0)
++ nr[x];
}
for (int i = 1; i <= N; ++ i)
{
f[i] = new int [nr[i] + 1];
nr[i] = 0;
}
fseek (stdin, 0, SEEK_SET);
scanf ("%d %d\n", &N, &S);
for (int i = 1; i <= N; ++ i)
{
scanf ("%d %d\n", &x, &y);
if (x != 0)
f[x][++nr[x]] = i;
else
root = i;
age[i] = y;
}
}
int cmp (const int a, const int b)
{
return sum[a] < sum[b];
}
void df (int i)
{
int jj;
for (int j = 1; j <= nr[i]; ++ j)
df (f[i][j]);
if (nr[i] == 0)
{
s[i] = 1;
sum[i] = age[i];
}
else
{
sum[i] = age[i];
verif = 0;
for (int j = 1; j <= nr[i]; ++ j)
ind[j] = j;
sort (f[i]+1, f[i]+nr[i]+1, cmp);
/*for (int j = 1; j <= nr[i]; ++ j)
fprintf (stderr, "%d ", sum[f[i][ind[j]]]);
fprintf (stderr, "\n");*/
for (int j = 1; j <= nr[i]; ++ j)
{
jj = ind[j];
if (sum[i] + sum[f[i][jj]] <= S)
{
s[i] += s[f[i][jj]];
sum[i] += sum[f[i][jj]];
verif++;
}
else
s[i] += s[f[i][jj]];
}
s[i] = s[i] - verif + 1;
}
}
void solve ()
{
df (root);
printf ("%d\n", s[root]);
}
int
main ()
{
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
read ();
solve ();
return 0;
}