#include using namespace std; #define mp make_pair #define pb push_back #define x first #define y second typedef pair pii; typedef long long ll; typedef unsigned long long ull; template void chkmax(T &x,T y){x void chkmin(T &x,T y){y void readint(T &x) { x=0;int f=1;char c; for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1; for(;isdigit(c);c=getchar())x=x*10+(c-'0'); x*=f; } const int MOD=998244353; inline int dmy(int x){return x>=MOD?x-MOD:x;} inline void inc(int &x,int y){x=dmy(x+y);} int qmi(int x,int y) { int ans=1; for(;y;y>>=1,x=1ll*x*x%MOD) if(y&1)ans=1ll*ans*x%MOD; return ans; } const int MAXN=100005,INF=0x3f3f3f3f; int n,k; vector G[MAXN]; int a[MAXN],kpa[MAXN],sta[MAXN],top,dep[MAXN],dfn[MAXN],sz[MAXN],dfn_cnt,perm[MAXN],fen[MAXN]; void dfs(int u) { dfn[u]=++dfn_cnt; sta[++top]=u; kpa[u]=sta[max(1,top-k)]; sz[u]=1; for(auto v:G[u])dep[v]=dep[u]+1,dfs(v),sz[u]+=sz[v]; --top; } void add(int x,int w){for(;x<=n;x+=(x&-x))fen[x]+=w;} int query(int x){int s=0;for(;x;x-=(x&-x))s+=fen[x];return s;} void solve() { readint(n),readint(k); for(int i=1;i<=n;++i)G[i].clear(),perm[i]=i,fen[i]=0; for(int i=2,u;i<=n;++i)readint(u),G[u].pb(i); for(int i=1;i<=n;++i)readint(a[i]); top=dfn_cnt=0; dfs(1); sort(perm+1,perm+n+1,[&](int x,int y){return dep[x]>dep[y];}); int ans=0; for(int ii=1;ii<=n;++ii) { int i=perm[ii]; if(!a[i] || query(dfn[i]))continue; ++ans; int j=kpa[i]; add(dfn[j],1);add(dfn[j]+sz[j],-1); } printf("%d\n",ans); } int main() { #ifdef LOCAL freopen("code.in","r",stdin); // freopen("code.out","w",stdout); #endif int T; readint(T); while(T--)solve(); return 0; }