#include <bits/stdc++.h>

#define ll int

using namespace std;

void fast_in_out() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}
const ll N=1e6;
ll mx[4*N],bn[4*N],mod[4*N];
void push(ll v){
    mod[2*v]+=mod[v],mod[2*v+1]+=mod[v];
    mx[2*v]+=mod[v],mx[2*v+1]+=mod[v];
    mod[v]=0;
}
void upd(ll v,ll l,ll r,ll lx,ll rx,ll x){
    push(v);
    if(l==lx && r==rx){
        mx[v]++;
        mod[v]++;
        return;
    }
    ll m=(l+r)/2;
    if(m>=rx)upd(2*v,l,m,lx,rx,x);
    else if(m<lx)upd(2*v+1,m+1,r,lx,rx,x);
    else
        upd(2*v,l,m,lx,m,x),upd(2*v+1,m+1,r,m+1,rx,x);
    mx[v]=0;
    if(bn[v]==0 && bn[2*v]==0)mx[v]=max(mx[v],mx[2*v]);
    if(bn[v]==0 && bn[2*v+1]==0)mx[v]=max(mx[v],mx[2*v+1]);
}

void ban(ll v,ll l,ll r,ll lx,ll rx,ll x){
    push(v);
    if(l==lx && r==rx){
        bn[v]=x;
        return;
    }
    ll m=(l+r)/2;
    if(m>=rx)ban(2*v,l,m,lx,rx,x);
    else if(m<lx)ban(2*v+1,m+1,r,lx,rx,x);
    else
        ban(2*v,l,m,lx,m,x),ban(2*v+1,m+1,r,m+1,rx,x);
    mx[v]=0;
    if(bn[v]==0 && bn[2*v]==0)mx[v]=max(mx[v],mx[2*v]);
    if(bn[v]==0 && bn[2*v+1]==0)mx[v]=max(mx[v],mx[2*v+1]);
}
ll get(ll v,ll l,ll r,ll lx,ll rx){
    push(v);
    if(l==lx && r==rx)return mx[v];
    ll m=(l+r)/2;
    if(m>=rx)return get(2*v,l,m,lx,rx);
    if(m<lx)return get(2*v+1,m+1,r,lx,rx);
    return max(get(2*v,l,m,lx,m),get(2*v+1,m+1,r,m+1,rx));
}

vector<ll> g[N+10];
vector<ll> vc;
ll w[N+10],ans[N+10],p[N+10],tin[N+10],tout[N+10],t=0,to[N+10],cnt=0,sz[N+10];
ll up[23][N+10],c[23][N+10];

void hld(ll v){
    ll v1=v;
    while(v!=1){
        ban(1,0,N,tin[to[v]],tin[v],1);
        v=p[to[v]];
    }
    v=v1;
    ans[v]=cnt-get(1,0,N,0,N);
    while(v!=1){
        ban(1,0,N,tin[to[v]],tin[v],0);
        upd(1,0,N,tin[to[v]],tin[v],1);
        v=p[to[v]];
    }
}
void dfs(ll v){
    ll i;
    to[v]=v;
    sz[v]=1;
    for(i=0;i<g[v].size();i++){
        dfs(g[v][i]);
        sz[v]+=sz[g[v][i]];
        if(sz[g[v][i]]>sz[g[v][0]])swap(g[v][i],g[v][0]);
    }
}
void dfs1(ll v){
    tin[v]=t++;
    if(g[v].size()>0)to[g[v][0]]=to[v];
    for(auto u:g[v]){
        dfs1(u);
    }
    tout[v]=t;
}
bool ch(ll v,ll u){
    if(tin[v]<=tin[u] && tout[u]<=tout[v])return true;
    return false;
}
bool comp(ll v,ll u){
    if(ch(v,u))return true;
    if(ch(u,v))return false;
    ll i,mnv=1e9,mnu=1e9;
    for(i=20;i>=0;i--){
        if(!ch(up[i][v],u)){
            mnv=min(mnv,c[i][v]);
            v=up[i][v];
        }
    }
    mnv=min(mnv,c[0][v]);
    for(i=20;i>=0;i--){
        if(!ch(up[i][u],v)){
            mnu=min(mnu,c[i][u]);
            u=up[i][u];
        }
    }
    mnu=min(mnu,c[0][u]);
    if(mnv>mnu)return true;
    return false;
}

int main() {
    fast_in_out();
    ll n,i,q,x,v,j;
    cin >> n >> q;
    up[0][1]=1;
    p[1]=1;
    for(i=2;i<=n;i++)ans[i]=-1;
    for(i=2;i<=n;i++){
        cin >> p[i];
        up[0][i]=p[i];
        g[p[i]].push_back(i);
    }
    for(i=1;i<=n;i++)cin >> w[i],vc.push_back(i),c[0][i]=w[i];
    dfs(1);
    dfs1(1);
    for(j=1;j<=20;j++){
        for(i=1;i<=n;i++){
            up[j][i]=up[j-1][up[j-1][i]];
            c[j][i]=min(c[j-1][i],c[j-1][up[j-1][i]]);
        }
    }
    sort(vc.begin(),vc.end(),comp);
    for(auto u:vc){
        hld(u);
        cnt++;
    }
    while(q--){
        cin >> v;
        cout << ans[v] << " ";
    }
    return 0;
}
