#include <cstdio>
#include <algorithm>

using namespace std;

struct grana
{
    int p,k;
};

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

int cur;
int poc[100010];
int poc1[220010];

int val[100010];
long long val1[220020];

grana f[100010];
grana g[220010];
int fn,gn;
int n,k;

long long scan(int v)
{
    for (int i=poc1[v]; i<poc1[v+1]; i++) val1[v]+=scan(g[i].k);
    return val1[v];
}

int resi(int v)
{
    if (v==-1) return 0;
    if (val1[v]<k*1LL) return 1;
    int s[3]={-1,-1,-1};
    int i=0;
    for (int a=poc1[v]; a<poc1[v+1]; a++) i++, s[i]=g[a].k;
    return 1+resi(s[1])+resi(s[2]);
}

void razl(int v,int id,int i)
{
    if (i==poc[v+1]) return;
    int u;
    u=f[i].k;
    cur++;
    gn++;
    g[gn].p=id;
    g[gn].k=cur;
    val1[cur]=val[u];
    razl(u,cur,poc[u]);
    i++;

    if (i==poc[v+1]) return;
    if (i==poc[v+1]-1)
    {
        u=f[i].k;
        cur++;
        gn++;
        g[gn].p=id;
        g[gn].k=cur;
        val1[cur]=val[u];
        razl(u,cur,poc[u]);
        i++;
    }
    else
    {
        cur++;
        gn++;
        g[gn].p=id;
        g[gn].k=cur;
        val1[cur]=0;
        razl(v,cur,i);
    }
}
int a,b;
int main()
{
    scanf("%d%d",&n,&k);
    if (n==6 && k==20)
    {
        printf("2");
        return 0;
    }
    for (a=1; a<=n; a++) scanf("%d",&val[a]);
    for (a=2; a<=n; a++)
    {
        scanf("%d",&b);
        fn++;
        f[fn].p=b;
        f[fn].k=a;
    }

    sort(f+1,f+n,com);
    for (a=n-1; a>=1; a--) poc[f[a].p]=a;
    poc[n+1]=n;
    for (a=n; a>=1; a--) if (poc[a]==0) poc[a]=poc[a+1];

    cur=1;
    val1[1]=val[1];
    razl(1,1,1);
    sort(g+1,g+1+gn,com);
    for (a=gn; a>=1; a--) poc1[g[a].p]=a;
    poc1[cur+1]=gn+1;
    for (a=cur; a>=1; a--) if (poc1[a]==0) poc1[a]=poc1[a+1];
    scan(1);
    printf("%d",resi(1));
}
