#include<bits/stdc++.h>

using namespace std;

using ll = long long;

int lg = 18;
int n;

vector<vector<int>> g, st;
vector<int> s, d, tin, tout, sz, tin1, que;

int t = 0;

void dfs(int v, int p) {
    tin[v] = t++;
    sz[v] = 1;
//    if (v != 0)
//        d[v] = min(d[p], s[v]); //считаем min предка
    for (auto u : g[v]) {
        if (u == p) continue;
        dfs(u, v);
        sz[v] += sz[u];
    }
    tout[v] = t++;
}

bool pred(int v, int u) {
    return tin[v] < tin[u] && tout[u] < tout[v];
}


//int lca(int v, int u) { //min на пути, не считая самого lca
//    int res = 1e6;
//    for (int i = lg - 1; i >= 0; --i) {
//        if (!pred(up[i][u], v)) {
//            res = min(res, mn[i][u]);
//            u = up[i][u];
//        }
//    }
//    return res;
//}

void bfs(int finish, int bad) {
    set<pair<int, int>> st;
    int cnt = 0;
    st.insert({s[0], 0});
    while (!st.empty()) {
        auto [d, v] = *st.rbegin();
        st.erase({d, v});
        tin1[v] = cnt;
        //if (v == finish) return cnt;
        ++cnt;
        for (auto u : g[v]) {
            if (u == bad) {
                st.insert({0, u});
            } else {
                st.insert({s[u], u});
            }
        }
    }
}

map<int, map<int, int>> res;

void calc_tin(int v) {
    st[v].push_back(tin1[v]);
    for (auto u : g[v]) {
        calc_tin(u);
        for (auto el : st[u])
            st[v].push_back(el);
        st[u].clear();
    }
    sort(st[v].begin(), st[v].end());
    for (auto el : que) {
        int bad = v;
        int ans = 1e6;
        if (pred(bad, el)) {
            int j = lower_bound(st[bad].begin(), st[bad].end(), tin1[el]) - st[bad].begin();
            ans = min(n - sz[bad] + j, ans);
        } else {
            int j = lower_bound(st[bad].begin(), st[bad].end(), tin1[el]) - st[bad].begin();
            ans = min(ans, tin1[el] - j);
        }
        res[bad][el] = ans;
    }

}


int get(int v) {
    int ans = 1e6;
    for (int i = 0; i < n; ++i) {
        if (i == v || pred(v, i)) continue;
        ans = res[i][v];
//        int bad = i;
//        if (pred(bad, v)) {
//            int j = lower_bound(st[bad].begin(), st[bad].end(), tin1[v]) - st[bad].begin();
//            ans = min(n - sz[bad] + j, ans);
//        } else {
//            int j = lower_bound(st[bad].begin(), st[bad].end(), tin1[v]) - st[bad].begin();
//            ans = min(ans, tin1[v] - j);
//        }

        //ans = min(ans, bfs(v, bad));
    }
    if (ans == 1e6)
        ans = 0;
    //ans = min(ans, bfs(v, -1));
    return ans;
}


int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int q;
    cin >> n >> q;
    g.resize(n);
    st.resize(n);
    sz.resize(n);
    tin.resize(n);
    tin1.resize(n);
    tout.resize(n);
    s.resize(n);
    d.resize(n);

    for (int i = 1; i < n; ++i) {
        int p;
        cin >> p;
        p--;
        g[p].push_back(i);
    }
    for (int i = 0; i < n; ++i)
        cin >> s[i];

    for (int i = 0; i < q; ++i) {
        int v;
        cin >> v;
        --v;
        que.push_back(v);
//  cout << get(v) << " ";
    }
    d[0] = 1e6;
    dfs(0, 0);
    bfs(-1, -1);
    calc_tin(0);
    for (auto el : que) {
        cout << get(el) << " ";
    }
}

