voidadd_edge(int u, int v) { f[cnt].v = v; f[cnt].next = head[u]; head[u] = cnt++; }
voiddfs(int u, int fa) { for (int i = head[u]; i != -1; i = f[i].next) { int v = f[i].v; if (v != fa && v != u) { dfs(v, u); if (vis[v] == 0 && vis[u] == 0) { vis[v] = 1; vis[u] = 1; tt++; } } } }
intmain() { int T; read(T); while (T--) { ans = 0; res = 0; cnt = 0; tt=0; read(n); read(k); init(n); for (int i = 1; i <= n - 1; i++) { int now; read(now); add_edge(now, i + 1); add_edge(i + 1, now); } dfs(1, 0); if (2 * tt < k) { ans = k - tt; } else ans = (k + 1) / 2; printf("%d\n",ans); } return0; }