dfs序然后莫队..
#include<bits/stdc++.h>
#define N 200010
using namespace std;
int n,m,x,g[N];
vector<int> s[N];
int cnt,b[N],e[N],a[N];
void dfs(int x) {
a[++cnt]=x;
b[x]=cnt;
for(int i=0;i<s[x].size();i++) dfs(s[x][i]);
a[++cnt]=x;
e[x]=cnt;
}
int belong[N];
struct query {
int id,ans;
int l,r;
} q[N];
bool cmp1(query a,query b) {
if(belong[a.l]=belong[b.l]) return a.r<b.r;
else return belong[a.l]<belong[b.l];
}
bool cmp2(query a,query b) {
return a.id<b.id;
}
int l,r,ans;
int vst[N];
void addl() {
vst[g[a[l]]]--;
if(vst[g[a[l]]]==0) ans--;
l++;
}
void minl() {
l--;
vst[g[a[l]]]++;
if(vst[g[a[l]]]==1) ans++;
}
void addr() {
r++;
vst[g[a[r]]]++;
if(vst[g[a[r]]]==1) ans++;
}
void minr() {
vst[g[a[r]]]--;
if(vst[g[a[r]]]==0) ans--;
r--;
}
int main() {
scanf("%d",&n);
int sqt=sqrt(n);
for(int i=1;i<=n;i++) belong[i]=(i-1)/sqt+1;
//for(int i=1;i<=n;i++) cout<<belong[i]<<" ";
for(int i=2;i<=n;i++) {
scanf("%d",&x);
s[x].push_back(i);
}
for(int i=1;i<=n;i++) {
cin>>g[i];
}
dfs(1);
//for(int i=1;i<=cnt;i++) cout<<a[i]<<" ";
//cout<<endl;
for(int i=1;i<=n;i++) {
q[i].l=b[i];
q[i].r=e[i];
q[i].id=i;
//cout<<"**"<<q[i].id<<" "<<q[i].l<<" "<<q[i].r<<"**\n";
}
sort(q+1,q+n+1,cmp1);
for(int i=1;i<=n;i++) {
while(l<q[i].l) addl();
while(l>q[i].l) minl();
while(r<q[i].r) addr();
while(r>q[i].r) minr();
q[i].ans=ans;
//cout<<"**"<<q[i].id<<" "<<q[i].l<<" "<<q[i].r<<" "<<l<<" "<<r<<" "<<ans<<"**\n";
}
sort(q+1,q+n+1,cmp2);
scanf("%d",&m);
for(int i=1;i<=m;i++) {
scanf("%d",&x);
cout<<q[x].ans<<endl;
}
}