#include #include #include #include const int N=100005; struct LnkNode{ int v,nxt; }edge[N]; int etot,fst[N]; void addedge_(int u,int v){ ++etot; edge[etot].v=v; edge[etot].nxt=fst[u]; fst[u]=etot; } int T,n,k,p[N],a[N],mx[N],res; void dfs(int x,int d){ mx[x]=a[x]*d; for(int i=fst[x];i;i=edge[i].nxt){ int &y=edge[i].v; dfs(y,d+1); mx[x]=std::max(mx[x],mx[y]); } if(mx[x]-d==k) ++res,mx[x]=0; } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&k); etot=0,memset(fst+1,0,n<<2); for(int i=2;i<=n;++i){ scanf("%d",p+i); addedge_(p[i],i); } for(int i=1;i<=n;++i) scanf("%d",a+i); res=0; dfs(1,1); if(mx[1]) ++res; printf("%d\n",res); } return 0; }