#include using namespace std; int n, k, p = 998244353; vector out[100010]; int dfn[100010], fa[100010], tot; int depth[100010], sz[100010]; void dfs(int x) { dfn[x] = ++tot; sz[x] = 1; for (int i : out[x]) depth[i] = depth[x] + 1, dfs(i), sz[x] += sz[i]; } int fwk[100010]; void chenge(int x, int k) { for (int i = x; i <= n; i += i & -i) fwk[i] += k; } int query(int x) { int ans = 0; for (int i = x; i > 0; i -= i & -i) ans += fwk[i]; return ans; } void work() { scanf("%d%d", &n, &k); tot = 0; for (int i = 1; i <= n; i++) { out[i].clear(); fwk[i] = 0; } for (int i = 2; i <= n; i++) { scanf("%d", &fa[i]), out[fa[i]].push_back(i); } dfs(1); priority_queue > fuck; for (int x, i = 1; i <= n; i++) { scanf("%d", &x); if (x == 1) fuck.push(make_pair(depth[i], i)); } int ans = 0; while (!fuck.empty()) { int x = fuck.top().second; fuck.pop(); if (query(dfn[x])) continue; for (int i = 1; i <= k; i++) { if (x == 1) break; x = fa[x]; } chenge(dfn[x], 1); chenge(dfn[x] + sz[x], -1); ans++; } printf("%d\n", ans); } int main() { int t; scanf("%d", &t); while (t--) work(); return 0; }