/* Варинат
1) тупняк
2) Бамбуки
3) Малое кол-во начальников
 */

#include <bits/stdc++.h>

using namespace std;

using ld = long double;
using ll = long long;
using pii = pair<int, int>;

void solve2(int n, const vector<vector<int>> &g, int root, vector<int> &ans, vector<int> &par, const vector<int> &ti, vector<int> &pval, vector<pii> &arr)
{
    function<void(int)> dfs = [&](int v)
    {
        arr.push_back({ti[v], v});
        for (const auto &u : g[v])
        {
            par[u] = par[v];
            dfs(u);
        }
    };
    int v1 = 0;
    int v2 = 0;
    int u1 = 0;
    int u2 = 0;
    for (const auto &u : g[root])
    {
        par[u] = u;
        pval[u] = 0;
        dfs(u);
        u1 = u2;
        u2 = u;
    }
    sort(arr.begin(), arr.end());
    for (const auto &[_, v] : arr)
    {
        int val = 0;
        // assert(par[v] == u1 || par[v] == u2);
        if (par[v] == u1)
        {
            val = v2;
            v1++;
        }
        else if (par[v] == u2)
        {
            val = v1;
            v2++;
        }
        ans[v] = max(ans[v], val);
    }
}

void solve()
{
    int n, q;
    cin >> n >> q;
    vector<vector<int>> g(n);
    vector<int> s(n);
    vector<int> ti(n, -1); // для каждой вершины момент времени, когда она корень без изменений

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

    int ct = 0;
    int cur = 0;
    set<pii> av;
    while (true)
    {
        assert(ti[cur] == -1);
        ti[cur] = ct;
        for (const auto &u : g[cur])
        {
            av.insert({s[u], u});
        }
        if (av.empty())
            break;
        auto it = av.rbegin();
        cur = it->second;
        av.erase({s[cur], cur});
        ++ct;
    }

    vector<vector<int>> h(n);

    function<void(int, int)> dfs = [&](int v, int hh)
    {
        h[hh].push_back(v);
        for (const auto &u : g[v])
        {
            dfs(u, hh + 1);
        }
    };

    dfs(0, 0);

    vector<int> ans(n, 0);
    vector<pii> arr;
    arr.reserve(n);

    for (const auto vs : h)
    {
        vector<int> par(n, -1);
        vector<int> pval(n, -1);

        for (const auto &root : vs)
        {
            solve2(n, g, root, ans, par, ti, pval, arr);
            arr.clear();
        }
    }

    for (int qq = 0; qq < q; ++qq)
    {
        int v;
        cin >> v;
        --v;
        int res = ti[v] - ans[v];
        cout << res << endl;
    }
}

signed main()
{
#ifdef ROMALOCAL
    freopen("in.txt", "r", stdin);
#endif

    cin.tie(0);
    ios::sync_with_stdio(0);

    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}