// i must be the reason why
// you have given up your smiles
// and the hope inside your life has been stolen
// i must be the reason why
// you have told me all these lies
// that i will lead a happier life without you by my side
// дальше текст забыл

// t.me/truebaza <---- лучший тг канал
// t.me/truebaza <---- лучший тг канал
// t.me/truebaza <---- лучший тг канал
// t.me/truebaza <---- лучший тг канал
// t.me/truebaza <---- лучший тг канал
// t.me/truebaza <---- лучший тг канал
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#define int long long
#define fastio cin.tie(0), ios_base::sync_with_stdio(false)
#define all(x) (x).begin(), (x).end()
#define INF ((1ll << 50) - 1)


vector<vector<int>> g;
vector<int> s;
vector<int> v;
vector<int> p;
vector<bool> active;
vector<int> sz;

void calcsz(int v) {
    sz[v] = 1;
    for (auto w : g[v]) {
        if (active[w]) {
            calcsz(w);
            sz[v] += sz[w];
        }
    }
}

auto main() -> signed { // t.me/truebaza <---- лучший тг канал
    fastio;
    int n, q;
    cin >> n >> q;
    g.resize(n);
    s.resize(n);
    p.resize(n, -1);
    for (int i = 1; i < n; ++i) {
        int pr;
        cin >> pr;
        pr--;
        g[pr].push_back(i);
        p[i] = pr;
    }
    for (auto& i : s) cin >> i;
    set<pair<int, int>> st;
    vector<int> order;
    // sort vertices by greedy algorithm
    st.insert({INF, 0});
    while (!st.empty()) {
        auto [val, v] = *st.rbegin();
        st.erase(*st.rbegin());
        order.push_back(v);
        for (auto w : g[v]) {
            st.insert({s[w], w});
        }
    }
    // add vertex, then find the biggest subtree that is not our ancestor,
    // answer for it is amount of vertices before us - this size???
    vector<int> ans(n, 0);
    active.resize(n);active[0] = true;
    sz.resize(n);
    for (int i = 1; i < n; ++i) {
        int v = order[i];
        int bsz = 0;
        // O(n), change later to faster version
        fill(all(sz), 0ll);
        calcsz(0);
        int cv = v;
        while (cv > 0) {
            int pre = p[cv];
            for (auto w : g[pre]) {
                if (w != cv) {
                    bsz = max(bsz, sz[w]);
                }
            }
            cv = p[cv];
        }
        ans[v] = i - bsz;
        active[v] = true;
    }
    while (q--) {
        int v;
        cin >> v;
        v--;
        cout << ans[v] << ' ';
    }
}