#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n,k;
int mint[100000]; //najmanji broj kupovina za podstablo sa korenom i
int minr[100000]; //minimalna vrednost pri poslednjoj kupovini za mint[i]
int v[100000];
int nad[100000];
vector <int> potomak[100000]; //potomci cvora i
bool cmp (int a,int b) { return minr[a]<minr[b]; }
int main ()
{
    freopen("porez.in","r",stdin);
    freopen("porez.out","w",stdout);
    scanf("%d %d",&n,&k);
    for (int i=0;i<n;i++) scanf("%d",&v[i]);
    for (int i=1;i<n;i++) {scanf("%d",&nad[i]);nad[i]--;potomak[nad[i]].push_back(i);}
    for (int i=n-1;i>=0;i--)
    {
        int t=1;
        int r=v[i];
        sort(potomak[i].begin(),potomak[i].end(),cmp);
        for (int j=0;j<potomak[i].size();j++)
        {
            t+=mint[potomak[i][j]];
            if (r+minr[potomak[i][j]] <= k)
            {
                r+=minr[potomak[i][j]];
                t--;
            }
        }
        mint[i]=t;
        minr[i]=r;
    }
    printf("%d\n",mint[0]);
}
