#include #include #include #include #include #include #include #include #define LL long long #define LD long double #define MAXN 100005 #define MAXM #define P #define MP make_pair #define PB push_back #define INF 0x3f3f3f3f #define dbg(a...) fprintf(stderr, a) using namespace std; int T, n, k, ans, f[MAXN], dep[MAXN], v[MAXN], vis[MAXN]; priority_queue > q1, q2; vector g[MAXN]; void dfs1(int x) { if(v[x]) q1.push(MP(dep[x], x)); for(int to: g[x]) { dep[to]=dep[x]+1; dfs1(to); } } void dfs2(int x) { vis[x]=1; if(v[x]) q2.push(MP(dep[x], x)); for(int to: g[x]) if(!vis[to]) dfs2(to); } int main() { scanf("%d", &T); while(T--) { ans=0; scanf("%d%d", &n, &k); for(int i=1; i<=n; ++i) { vis[i]=0; g[i].clear(); } f[1]=1; for(int i=2, p; i<=n; ++i) { scanf("%d", &p); g[p].PB(i); f[i]=p; } for(int i=1; i<=n; ++i) scanf("%d", &v[i]); dfs1(1); while(!q1.empty()) { while(!q1.empty() && !q2.empty() && q1.top().second==q2.top().second) q1.pop(), q2.pop(); if(q1.empty()) break; int x=q1.top().second; for(int i=1; i<=k; ++i) x=f[x]; dfs2(x); ans++; } printf("%d\n", ans); } return 0; }