#pragma GCC optimize("Ofast","inline","-ffast-math") #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include #include #include //#define int long long using namespace __gnu_pbds; using namespace std; struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; int n,k,cnt,p[100010],l[100010],r[100010],dep[100010],a[100010],par[100010][20]; int tag[400010]; vector v[100010]; inline void dfs(int x,int pr) { l[x]=++cnt; par[x][0]=pr; for(int i=0;i=0;i--){ if(y&(1<l){ int mid=(l+r)/2; build(o*2,l,mid); build(o*2+1,mid+1,r); } } inline void update(int o,int l,int r,int x,int y) { if(ry) return; if(x<=l&&r<=y){ tag[o]=1; return; } if(tag[o]){ tag[o*2]=1;tag[o*2+1]=1;tag[o]=0; } int mid=(l+r)/2; update(o*2,l,mid,x,y); update(o*2+1,mid+1,r,x,y); } inline int query(int o,int l,int r,int x) { if(rx) return 0; if(x==l&&r==x) return tag[o]; if(tag[o]){ tag[o*2]=1;tag[o*2+1]=1;tag[o]=0; } int mid=(l+r)/2,res=0; res=max(res,query(o*2,l,mid,x)); res=max(res,query(o*2+1,mid+1,r,x)); return res; } signed main() { ios::sync_with_stdio(false); int t;cin>>t; while(t--){ cin>>n>>k; for(int i=1;i<=n;i++) v[i].clear(); for(int i=2;i<=n;i++) cin>>p[i],v[p[i]].push_back(i); for(int i=1;i<=n;i++) cin>>a[i]; cnt=0;dfs(1,-1);init(); build(1,1,cnt); vector > g; for(int i=1;i<=n;i++) if(a[i]) g.push_back(make_pair(dep[i],i)); if(g.empty()){ cout<<0<<'\n'; continue; } sort(g.begin(),g.end()); reverse(g.begin(),g.end()); int ans=0; for(int i=0;i