#pragma GCC optimize("Ofast")
#include "bits/stdc++.h"
#pragma  GCC target("avx2")
using namespace std;
# define int long long
# define all(a) a.begin(), a.end()
vector<int> s;
struct cmp{
    bool operator()(int a, int b) const{
        return s[a] > s[b];
    }
};

vector<int> t;
void push(int v, int l, int r){
    if(r - l > 1) {
        t[2 * v + 1] = max(t[2 * v + 1], t[v]);
        t[2 * v + 2] = max(t[2 * v + 2], t[v]);
    }
}

void upd(int ql, int qr, int x, int v, int l, int r){
    if(ql == qr) return;
    if(ql == l && qr == r) {
        t[v] = max(t[v], x);
        return;
    }
    push(v, l, r);
    int m = (r + l) / 2;
    if(qr <= m){
        upd(ql, qr, x, 2 * v + 1, l, m);
    } else if(ql >= m){
        upd(ql, qr, x, 2 * v + 2,  m, r);
    } else {
        upd(ql, m, x, 2 * v + 1, l, m);
        upd(m, qr, x, 2 * v + 2,  m, r);
    }
 }

 int get(int i, int v, int l, int r){
    if(r - l == 1){
        return t[v];
    }
    push(v, l, r);
    int m = (r + l) / 2;
    if(i < m){
        return  get(i, 2 * v + 1, l,  m);
    } else {
        return get(i, 2 * v + 2, m, r);
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
//    cerr << (int)(3e5 * 100 * 20) << endl;
    int n, q;
    cin >> n >> q;
    vector<vector<int>> g(n);
    vector<int> pred(n, -1);
    for(int i = 1; i < n; ++i){
        int p;
        cin >> p;
        --p;
        pred[i] = p;
        g[p].push_back(i);
    }
    vector<int> tin(n), tout(n), sz(n, 1);
    int timer = 0;
    auto dfs = [&](auto &&self, int v) ->void{
        tin[v] = timer++;
        for(auto u : g[v]){
            self(self, u);
            sz[v] += sz[u];
        }
        tout[v] = timer++;
    };
    auto is_parent = [&](int v, int par){
        return tin[par] <= tin[v] && tout[v] <= tout[par];
    };
    dfs(dfs, 0);
    s.resize(n);
    for(auto &i : s) cin >> i;
    set<int, cmp> opened;
    opened.insert(all(g[0]));
    vector<int> pos{0};
    while(!opened.empty()){
        int v = *opened.begin();
        opened.erase(opened.begin());
        pos.push_back(v);
        opened.insert(all(g[v]));
    }
    vector<int> wans(n);
    for(int i = 0; i < pos.size(); ++i){
        wans[pos[i]] = i;
    }
    vector<int> ans(n);
    t.resize(4 * pos.size());
    for(auto v : pos){
        if(v == 0) continue;
        ans[v] = wans[v] - get(wans[v], 0, 0, pos.size());
        upd(wans[v] + sz[v], pos.size(), sz[v], 0, 0, pos.size());
    }
//    vector<int> ans(n), cnt(n);
//    vector<multiset<int>> cm(n);
//    for(int v = 0; v < n; ++v){
//        for(auto u : g[v]){
//            cm[v].insert(cnt[u]);
//        }
//    }
//    for(auto v : pos){
//        int p = pred[v];
//        int res = 0;
//        int pref = v;
//        while(p != -1){
//            cm[p].extract(cnt[pref]);
//            if(!cm[p].empty()){
//                res = max(res, *cm[p].rbegin());
//            }
//            ++cnt[pref];
//            cm[p].insert(cnt[pref]);
//            pref = p;
//            p = pred[p];
//        }
//        ans[v] = wans[v] - res;
//    }
    while(q--){
        int v;
        cin >> v;
        --v;
        cout << ans[v] << ' ';
    }
    return 0;
}