#include using namespace std; const int MAXN = 1e5 + 5; vector g[MAXN]; int tot, par[MAXN][18], dep[MAXN], dfn[MAXN], sz[MAXN], sum[MAXN]; void dfs(int u, int f, int d) { dfn[u] = ++tot; sz[u] = 1, dep[u] = d, par[u][0] = f; for (int i = 1; i < 18; i++) { par[u][i] = par[par[u][i - 1]][i - 1]; } for (int v : g[u]) { if (v != f) { dfs(v, u, d + 1); sz[u] += sz[v]; } } } void upd(int at, int d) { for (int i = at; i < MAXN; i += (~i & (i + 1))) { sum[i] += d; } } int query(int at) { int res = 0; for (int i = at; i >= 0; i -= (~i & (i + 1))) { res += sum[i]; } return res; } int main(int argc, char **argv) { cin.sync_with_stdio(false), cin.tie(nullptr); int t; cin >> t; while (t--) { int n, k; cin >> n >> k; tot = 0; for (int i = 1; i <= n; i++) { g[i].clear(); sum[i] = 0; } for (int i = 2; i <= n; i++) { int p; cin >> p; g[p].push_back(i); g[i].push_back(p); } dfs(1, 0, 0); vector candy; candy.reserve(n); for (int i = 1; i <= n; i++) { int x; cin >> x; if (x == 1) { candy.push_back(i); } } sort(candy.begin(), candy.end(), [&](int x, int y) { return dep[x] > dep[y]; }); int ans = 0; for (int u : candy) { if (query(dfn[u]) > 0) { continue; } ++ans; int x = u, d = min(dep[x], k); for (int i = 17; i >= 0; i--) { if (d & (1 << i)) { x = par[x][i]; } } upd(dfn[x], 1); upd(dfn[x] + sz[x], -1); } cout << ans << "\n"; } }