#include #define db double #define reg register #define LL long long #define pb push_back #define lb lower_bound #define ub upper_bound #define ull unsigned long long #define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i) #define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i) #define erep(i,a) for(int i=head[a];i;i=e[i].nxt) using namespace std; bool Handsome; inline int rd(){ reg int x=0;reg char o=getchar();reg bool O=0; for(;o<48 || 57y && (x=y));} inline void Mx(int &x,int y){if(xd; } }; priority_queue q; struct BIT{ int t[M]; void clr(){ memset(t,0,sizeof(t)); } void add(int x,int y){ for(;x<=n;x+=x&-x)t[x]+=y; } int ask(int x){ int res=0; for(;x;x-=x&-x)res+=t[x]; return res; } }bit; void Add(int x,int y){ e[++cnte]=(edge){y,head[x]}; head[x]=cnte; } void Clear(){ memset(head,0,sizeof(head)); bit.clr(); cnte=tot=ans=0; } void dfs(int x){ pre[L[x]=++tot]=x; rep(i,1,B)fa[x][i]=fa[fa[x][i-1]][i-1]; erep(i,x){ int y=e[i].to; dep[y]=dep[fa[y][0]=x]+1; dfs(y); } R[x]=tot; if(a[x])q.push((node){x,dep[x]}); } void solve(){ n=rd();m=rd(); rep(i,2,n){int x=rd();Add(x,i);} rep(i,1,n)a[i]=rd(); dfs(1); while(!q.empty()){ int x=q.top().x;q.pop(); if(bit.ask(L[x]))continue; ++ans; if(m>=dep[x])x=1; else rep(i,0,B)if((m>>i)&1)x=fa[x][i]; bit.add(L[x],1);bit.add(R[x]+1,-1); } printf("%d\n",ans); } bool Most; int main(){ // printf("%.2lfMB\n",(&Most-&Handsome)/1024.0/1024.0); int t=rd(); while(t--)Clear(),solve(); return 0; }