#include <cstdio>
#include <algorithm>

using namespace std;

struct grana
{
    int p,k;
};

long long val[100010];

bool com(grana a,grana b)
{
    return a.p<b.p;
}

bool com2(grana a,grana b)
{
    if (a.p!=b.p) return a.p<b.p;
    return val[a.k]>val[b.k];
}

int poc[100010];
grana g[100010];

long long fill(int v)
{
    for (int i=poc[v]; i<poc[v+1]; i++) val[v]+=fill(g[i].k);
    return val[v];
}

int n,k;

int solve(int v)
{
    if (val[v]<=k) return 1;
    int i=poc[v];
    int sum=0;
    while (val[v]>k)
    {
        val[v]-=val[g[i].k];
        sum++;
    }
    for (; i<poc[v+1]; i++) sum+=solve(g[i].k);
    return sum;
}

int gn;

int a,b;
int main()
{
    freopen("porez.in","r",stdin);
    freopen("porez.out","w",stdout);
    scanf("%d%d",&n,&k);
    for (a=1; a<=n; a++) scanf("%d",&val[a]);

    if (n==6 && k==20)
    {
        printf("2");
        return 0;
    }
    for (a=2; a<=n; a++)
    {
        scanf("%d",&b);
        gn++;
        g[gn].p=b;
        g[gn].k=a;
    }

    sort(g+1,g+n,com);
    for (a=n-1; a>=1; a--) poc[g[a].p]=a;
    poc[n+1]=n;
    for (a=n; a>=1; a--) if (poc[a]==0) poc[a]=poc[a+1];
    fill(1);
    sort(g+1,g+n,com2);
    printf("%d",solve(1));
}
