#include<stdio.h>
#include<stdlib.h>
#define nmax 100002
long *niv[nmax],ls1[nmax],ld1[nmax],nvm,poz[nmax],p[nmax],max,ld[nmax],ls[nmax],v[nmax],*fiu[nmax],n,S;
long s[nmax];
char viz[nmax];
void readdata()
{long i;
freopen("mese.in","r",stdin);
scanf("%ld%ld",&n,&S);
max=n;
for(i=0;i<=n;i++)
{fiu[i]=(long*)realloc(fiu[i],sizeof(long));
fiu[i][0]=0;
niv[i]=(long*)realloc(niv[i],sizeof(long));
niv[i][0]=0;
}
for(i=1;i<=n;i++)
{scanf("%ld%ld",&p[i],&v[i]);
fiu[p[i]]=(long *) realloc(fiu[p[i]],(++fiu[p[i]][0]+1)*sizeof(long));
fiu[p[i]][fiu[p[i]][0]]=i;
}
return;
}
void DFS(long vf,long ni)
{long i;
viz[vf]=1;
niv[ni]=(long*)realloc(niv[ni],(++niv[ni][0]+1)*sizeof(long));
niv[ni][niv[ni][0]]=vf;
if(ni>nvm)
nvm=ni;
for(i=1;i<=fiu[vf][0];i++)
if(!viz[fiu[vf][i]])
DFS(fiu[vf][i],ni+1);
}
void form_lsld(long ni,long s)
{long x,i;
if(!ni) return;
for(i=1;i<=niv[ni][0];i++)
{x=niv[ni][i];
poz[x]=++s;
if(!ls1[p[x]])
ls1[p[x]]=s;
ld1[p[x]]=s;
}
form_lsld(ni-1,s);
}
void renum()
{long i,j;
for(i=1;i<=n;i++)
{s[poz[i]]=v[i];
ls[poz[i]]=ls1[i];
ld[poz[i]]=ld1[i];
}
for(i=1;i<=nvm;i++)
for(j=1;j<=niv[i][0];j++)
niv[i][j]=poz[niv[i][j]];
//memcpy(p,par,sizeof(par));
//memcpy(niv,nivv,sizeof(nivv));
}
void sort(long ls,long ld)
{
long mij=(ls+ld)>>1,i,j,k;
if(ls==ld) return;
sort(ls,mij);
sort(mij+1,ld);
for(k=i=ls,j=mij+1;i<=mij||j<=ld;)
if(j>ld||(s[i]<s[j]&&i<=mij))
v[k++]=s[i++];
else
v[k++]=s[j++];
for(k=ls;k<=ld;k++)
s[k]=v[k];
}
void solve(long ni)
{long x,i,j;
if(!ni) return;
for(i=1;i<=niv[ni][0];i++)
{x=niv[ni][i];
sort(ls[x],ld[x]);
for(j=ls[x];j<=ld[x];j++)
if(s[x]+s[j]<=S)
{s[x]+=s[j];
max--;
}
}
solve(ni-1);
}
void printdata()
{freopen("mese.out","w",stdout);
printf("%ld",max);
fclose(stdout);
}
int main()
{
readdata();
//aflu cate niv si cate elem au fiecare
DFS(0,0);
//renumerotez si formez ls,ld;
form_lsld(nvm,0);
renum();
solve(nvm-1);
printdata();
return 0;
}