#include<bits/stdc++.h>

using namespace std;

using ll = long long;

int lg = 18;
int n;

vector<vector<int>> g, up, mn;
vector<int> s, d, tin, tout, sz;

int t = 0;

void dfs(int v, int p) {
    tin[v] = t++;
    up[0][v] = p;
    sz[v] = 1;
//    if (v != 0)
//        d[v] = min(d[p], s[v]); //считаем min предка
    mn[0][v] = s[p];
    for (int i = 1; i < lg; ++i) {
        up[i][v] = up[i - 1][up[i - 1][v]];
        mn[i][v] = min(mn[i - 1][v], mn[i - 1][up[i - 1][v]]);
    }
    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];
}


//void calc(int v, int w, int &cnt, int start) {
//    if (v == start) return;
//    //cout << v + 1 << endl;
//    cnt++;
//    for (auto u : g[v]) {
//        if (s[u] > s[start] && u != w)
//            calc(u, w, cnt, start);
//        if (u == w)
//            cnt += sz[u];
//    }
//}

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;
}

int 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});
        if (v == finish) return cnt;
        ++cnt;
        for (auto u : g[v]) {
            if (u == bad) {
                st.insert({0, u});
            } else {
                st.insert({s[u], u});
            }
        }
    }
}


int get(int v) {
    int ans = 1e6;
    for (int i = 0; i < n; ++i) {
        if (i == v || pred(v, i)) continue;
        int bad = i;
        ans = min(ans, bfs(v, bad));
    }
    ans = min(ans, bfs(v, -1));
    return ans;
}

//int get(int v) {
//    int ans = 1e6;
//    for (int i = 0; i < n; ++i) {
//        if (i == v || pred(v, i)) continue;
//        int bad = i;
//        int res = 0;
//        for (int j = 0; j < n; ++j) {
//            if (j == bad || j == v) continue;
//            int mn_j_lca = min(lca(v, j), s[j]);
//            int mn_v_lca = min(lca(j, v), s[v]);
//            if (pred(bad, j) && !pred(bad, v)) mn_j_lca = 0;
//            //cout << bad + 1 << " " << pred(j, v) << " " << mn_j_lca << " " << mn_v_lca << endl;
//            if (pred(j, v) || mn_j_lca > mn_v_lca) ++res;
//        }
//        ans = min(ans, res);
//    }
//    if (ans == 1e6) ans = 0;
//    return ans;
//}


int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int q;
    cin >> n >> q;
    g.resize(n);
    sz.resize(n);
    tin.resize(n);
    tout.resize(n);
    up.resize(lg, vector<int> (n));
    mn.resize(lg, vector<int> (n, 1e6));
    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];
    d[0] = 1e6;
    dfs(0, 0);
    //exit(0);
    for (int i = 0; i < q; ++i) {
        int v;
        cin >> v;
        --v;
        cout << get(v) << " ";
    }
}

