#include using namespace std; #define fi first #define se second #define SZ(x) ((int)x.size()) #define lowbit(x) x&-x #define pb push_back #define ls (u<<1) #define rs (u<<1|1) #define ALL(x) (x).begin(),(x).end() #define UNI(x) sort(ALL(x)),x.resize(unique(ALL(x))-x.begin()) #define GETPOS(c,x) (lower_bound(ALL(c),x)-c.begin()) #define LEN(x) strlen(x) #define MS0(x) memset((x),0,sizeof((x))) #define Rint register int typedef unsigned int unit; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef pair pii; typedef pair pll; typedef vector Vi; typedef vector Vll; typedef vector Vpii; template void _R(T &x) { cin >> x; } void _R(int &x) { scanf("%d", &x); } void _R(ll &x) { scanf("%lld", &x); } void _R(ull &x) { scanf("%llu", &x); } void _R(double &x) { scanf("%lf", &x); } void _R(char &x) { scanf(" %c", &x); } void _R(char *x) { scanf("%s", x); } void R() {} template void R(T &head, U &... tail) { _R(head); R(tail...); } template void _W(const T &x) { cout << x; } void _W(const int &x) { printf("%d", x); } void _W(const ll &x) { printf("%lld", x); } void _W(const double &x) { printf("%.16f", x); } void _W(const char &x) { putchar(x); } void _W(const char *x) { printf("%s", x); } template void _W(const pair &x) {_W(x.fi); putchar(' '); _W(x.se);} template void _W(const vector &x) { for (auto i = x.begin(); i != x.end(); _W(*i++)) if (i != x.cbegin()) putchar(' '); } void W() {} template void W(const T &head, const U &... tail) { _W(head); putchar(sizeof...(tail) ? ' ' : '\n'); W(tail...); } const int MOD=998244353,mod=998244353; ll qpow(ll a,ll b) {ll res=1;a%=MOD; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} const int MAXN=1e5+10,MAXM=2e6+10; const int INF=INT_MAX,SINF=0x3f3f3f3f; const ll llINF=LLONG_MAX; const int inv2=(MOD+1)/2; const int Lim=1<<20; struct Edge { int v,nxt; }e[MAXM]; int head[MAXN],ecnt; void add_edge(int u,int v) { e[++ecnt]={v,head[u]};head[u]=ecnt; } int dep[MAXN],fa[MAXN][20],dfn[MAXN],dfncnt,n,m; void LCA_pre_dfs(int u,int f,int d) { dep[u]=d;fa[u][0]=f;dfn[u]=++dfncnt; for(int i=head[u];i;i=e[i].nxt) { if(e[i].v!=f)LCA_pre_dfs(e[i].v,u,d+1); } } void LCA_pre() { LCA_pre_dfs(1,1,1); for(int j=1;j<=19;j++) for(int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1]; } int LCA(int u,int k) { for(int i=19;i>=0;i--) if((k>>i)&1)u=fa[u][i]; return u; } int k; bool vis[MAXN]; void dfs(int u) { if(vis[u])return; vis[u]=1; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].v; dfs(v); } } void solve() { R(n,k); for(int i=1;i<=n;i++)head[i]=vis[i]=0; ecnt=dfncnt=0; for(int i=2;i<=n;i++) { int p;R(p); add_edge(p,i); } Vi vec; for(int i=1;i<=n;i++) { int a;R(a); if(a)vec.pb(i); } LCA_pre(); sort(ALL(vec),[&](int a,int b){return dep[a]>dep[b];}); int ans=0; for(auto j:vec) { if(vis[j])continue; int v=LCA(j,k); dfs(v); ans++; } W(ans); } int main() { srand(time(0)); //freopen("input.txt","w",stdout); //freopen("test_output.txt","w",stdout); int T=1;R(T); while(T--)solve(); return 0; }