//#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma") //#pragma GCC optimize("unroll-loops") #include #define N 100005 #define inf 2147483647 #define LL long long using namespace std; int T,n,top,tot,k,dep[N],st[N],dfn[N],low[N],rk[N],f[N],S[N<<2],ans,fir[N],nxt[N<<1],son[N<<1];bool ok[N];inline void add(int x,int y){son[++tot]=y,nxt[tot]=fir[x],fir[x]=tot;} inline void dfs(int x){st[++top]=x,dep[x]=top,dfn[x]=low[x]=++tot;if(ok[x]) f[x]=st[max(1,top-k)];for(register int i=fir[x];i;i=nxt[i]) dfs(son[i]),low[x]=low[son[i]];top--;} inline bool cmp(int x,int y){return dep[x]>dep[y];} inline void B(int x,int l,int r){S[x]=0;if(l==r) return;int mid=l+r>>1;B(x<<1,l,mid),B(x<<1|1,mid+1,r);} inline void U(int x,int l,int r,int ll,int rr){if(l>=ll&&r<=rr){S[x]=1;return;}if(S[x]) S[x<<1]=S[x<<1|1]=S[x];int mid=l+r>>1;if(mid>=ll) U(x<<1,l,mid,ll,rr);if(mid>1;if(mid>=pos) return Q(x<<1,l,mid,pos);return Q(x<<1|1,mid+1,r,pos); } //int T,n,Max,tot,ans,sz[N],fir[N],nxt[N<<1],st[N],r[N],son[N<<1],dep[N],s[N][N];bool ok[N];const int p=998244353;inline void add(int x,int y){son[++tot]=y,nxt[tot]=fir[x],fir[x]=tot;} //inline void dfs(int id,int x,int fa){dep[x]=dep[fa]+1,s[id][dep[x]]++,Max=max(Max,dep[x]);for(register int i=fir[x];i;i=nxt[i]) if(son[i]^fa) dfs(id,son[i],x);} //inline void dfs3(int x,int fa){sz[x]=0;if(ok[x]) sz[x]=1;for(register int i=fir[x];i;i=nxt[i]) if(son[i]^fa) dfs3(son[i],x),sz[x]+=sz[son[i]];} //inline void dfs2(int id,int x,int fa,int dep){ // st[dep]=x;if((id> (char&ch){while(ch=nc(),ch==' '||ch=='\n');return *this;} templateFastIO& operator >> (T&ret){ ret=0;int f=1;char ch=nc();while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=nc();} while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=nc();}ret*=f;return *this; } FastIO& operator >> (char* s){int Len=0;char ch=nc();while(ch!='\n'){*(s+Len)=ch;Len++;ch=nc();}} templateFastIO& operator << (T x){ if(x<0){pc('-');x=-x;}do{stk[++stk[0]]=x%10;x/=10;}while(x); while(stk[0]) pc('0'+stk[stk[0]--]);return *this; } FastIO& operator << (char ch){pc(ch);return *this;} FastIO& operator << (string str){int Len=str.size()-1;for(stk[0]=0;Len>=0;Len--) stk[++stk[0]]=str[Len];while(stk[0]) pc(stk[stk[0]--]);return *this;} }fin,fout; int main(){ // freopen("data.in","r",stdin); // freopen("std.out","w",stdout); // srand(time(NULL)); // fin>>T;while(T--){ // LL res=0;fin>>n;for(register int i=1;i<=n;i++) fin>>a[i],b[i]=c[i]=i;int res1=0,res2=0; // for(register int i=1;i<=3*n;i++){int l=rand()%n+1,r=rand()%n+1;swap(b[l],b[r]);} // for(register int i=1;i<=7*n;i++){int l=rand()%n+1,r=rand()%n+1;swap(c[l],c[r]);} // for(register int i=1;i<=n;i++){if(a[i]==b[i]) res1++;if(a[i]==c[i]) res2++;} // if(res1>=res2) puts("First");else puts("Second"); // } // fin>>T;while(T--){ // fin>>n;tot=0;for(register int i=1;i<=n;i++) r[i]=fir[i]=ok[i]=0;for(register int i=1,x,y;i>x>>y,r[x]++,r[y]++,add(x,y),add(y,x); // for(register int i=1;i<=n;i++) for(register int j=1;j<=n;j++) s[i][j]=0;Max=0;for(register int i=1;i<=n;i++) dfs(i,i,0);cout<=p)&&(ans-=p);} // for(register int i=1;i<=n;i++) if(ok[i]) dfs3(i,0),dfs2(i,i,0,1);cout<>T;while(T--){ fin>>n>>k;for(register int i=1;i<=n;i++) fir[i]=0;tot=0;for(register int i=2,x;i<=n;i++) fin>>x,add(x,i);for(register int i=1;i<=n;i++) fin>>ok[i],rk[i]=i;tot=top=0,dfs(1),ans=0,B(1,1,n); sort(rk+1,rk+n+1,cmp);for(register int i=1;i<=n;i++) if(ok[rk[i]]) if(!Q(1,1,n,dfn[rk[i]])) ans++,U(1,1,n,dfn[f[rk[i]]],low[f[rk[i]]]);cout<