#pragma GCC optimize("Ofast")

#include <bits/stdc++.h>
using namespace std;
#ifdef _LOCAL
#define debug(x) cout << __LINE__ << ' ' << __PRETTY_FUNCTION__ << ": " << (x) << endl
#else
#define debug(...) 238;
#endif
mt19937 rng(238);
mt19937_64 rng64(238);
using ll = long long;
template <typename T, int U>
using ar = array<T, U>;
template <typename T, typename U>
bool chmin(T& x, const U&& y) {
    if (x > y) {
        x = y;
        return true;
    }
    return false;
}
template <typename T, typename U>
bool chmax(T& x, const U&& y) {
    if (x < y) {
        x = y;
        return true;
    }
    return false;
}

#include <ext/pb_ds/assoc_container.hpp>
template <typename T>
using ordered_set = __gnu_pbds::tree<T, __gnu_pbds::null_type,
                                     less<T>,
                                     __gnu_pbds::rb_tree_tag,
                                     __gnu_pbds::tree_order_statistics_node_update>; 
constexpr int Inf = 0x3f3f3f3f;
constexpr ll inf = 1144000000000000000;


const int maxn = 300005;
vector<int> g[maxn];
int s[maxn], id[maxn];

void solve() {
    int n, q;
    cin >> n >> q;
    id[0]++;
    for (int p, i = 1; i < n; ++i) {
        cin >> p;
        --p;
        if (p == 0) {
            id[i] = id[i - 1] + 1;
        } else {
            id[i] = id[i - 1];
        }
        g[p].push_back(i);
    }
    id[0]--;
    for (int i = 0; i < n; ++i) {
        cin >> s[i];
    }
    vector<int> queries(q);
    for (int& x : queries) {
        cin >> x;
        --x;
    }

    vector<int> paths(n + 1), results(n);
    int t = 0;
    priority_queue<pair<int, int>> pq;
    pq.emplace(s[0], 0);
    multiset<int> pths;
    for (int i = 0; i < n + 5; ++i) {
        pths.insert(0);
    }
    while (!pq.empty()) {
        auto [prior, key] = pq.top();
        results[key] = t;
        if (paths[id[key]] != *pths.rbegin()) {
            results[key] -= *pths.rbegin();
        } else {
            results[key] -= *next(pths.rbegin());
        }
        pq.pop();
        for (int v : g[key]) {
            pq.emplace(s[v], v);
        }
        t++;
        pths.extract(paths[id[key]]);
        pths.insert(++paths[id[key]]);
    }

    for (int x : queries) {
        cout << results[x] << ' ';
    }
}

int main() {
#ifdef _LOCAL
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
    freopen("test.out", "w", stderr);
#endif
    cin.tie(0)->sync_with_stdio(0);

    int Tc = 1;
    // cin >> Tc;
    while (Tc--) {
        solve();
        cout << '\n';
    }

    return 0;
}