{
edge[E].v=b;
edge[E].w=w;
edge[E].next=head[a];
head[a]=E++;
}
int dis1[maxn],dis2[maxn];
bool vis[maxn];
int q[maxn];
void bfs(int s,int &ss,int dist[]) {
fill(dist,dist+n+1,inf);
fill(vis,vis+n+1,false);
vis[s]=true;
dist[s]=0;
int front(0),tail(0),u,v,w;
q[0]=s;int Max=0;
while(front<=tail) {
u=q[front++];
for(int i=head[u];i!=-1;i=edge[i].next) {
v=edge[i].v,w=edge[i].w;
if(vis[v]) continue;
vis[v]=true;
dist[v]=dist[u]+w;
if(dist[v]>Max) {
Max=dist[v];
ss=v;
}
q[++tail]=v;
}
}
}
inline int min(int a,int b){
return a }
inline int max(int a,int b){
return a>b a:b;
}
int mx[maxn<<2],mi[maxn<<2];
void pushup(int rt){
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
}
void build(int l,int r,int rt){
if(l==r){
mx[rt]=mi[rt]=num[l];
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
int find_min(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return mi[rt];
int m=(l+r)>>1;
int ret=inf;
if(L<=m) ret=min(ret,find_min(L,R,lson));
if(R>m) ret=min(ret,find_min(L,R,rson));
return ret;
}
int find_max(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return mx[rt];
}
int m=l+r>>1;
int ret=0;
if(L<=m) ret=max(ret,find_max(L,R,lson));
if(R>m) ret=max(ret,find_max(L,R,rson));
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
E=0;fill(head,head+n+1,-1);
for(int i=2,fa,w;i<=n;i++)
{
scanf("%d%d",&fa,&w);
add_edge(i,fa,w);
add_edge(fa,i,w);
}
int ss,tt;
bfs(1,ss,dis1);
bfs(ss,tt,dis1);
bfs(tt,ss,dis2);
for(int i=1;i<=n;i++)
{
num[i]=max(dis1[i],dis2[i]);
}
int l=1,r=1,mx,mi;
int ans=0;
build(1,n,1);
while(r<=n)
{
mx=find_max(l,r,1,n,1);
mi=find_min(l,r,1,n,1);
if(mx-mi<=m)
{
ans=max(ans,r-l+1);
r++;
}
else {
l++;
}
}
printf("%d\n",ans);
return 0;
}