#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
const int N = 1e5 + 10, M = N * 2;
const int INF = 0x3f3f3f3f3f3f3f3f;
int h[N], e[M], ne[M], idx;
int depth[N], dad[N], st[N];
// 当前访问过的所有节点中的最大深度
// 当前访问过的节点的个数
int max_depth = 0, nodesize = 0;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
// 求解每个点的深度
void dfs(int u, int fa)
{
for(int i = h[u]; i!= -1; i = ne[i])
{
int b = e[i];
if(b == fa) continue;
depth[b] = depth[u] + 1;
dfs(b, u);
}
}
//从u点向上搜索,并且标记访问的点
void up(int u)
{
if(u == -1) return;
if(st[u] == 1) return ;
st[u] = 1;
max_depth = max(max_depth, depth[u]);
nodesize ++;
up(dad[u]);
}
signed main()
{
memset(h, -1, sizeof h);
int n, m, root;
cin >> n >> m;
for(int i = 1; i <= n; i ++)
{
int fa;
cin >> fa;
dad[i] = fa;
if(fa == -1)
{
root = i;
}
else
{
add(i, fa);
add(fa, i);
}
}
depth[root] = 0;
dfs(root, -1);
for(int i = 0; i < m; i ++)
{
int x;
cin >> x;
up(x);
// (nodesize - 1) * 2:访问当前所有的送餐地址,需要访问的点的个数
// max_depth:从起点到所有当前送餐地址中,最大的距离
int res = (nodesize - 1) * 2 - max_depth;
cout << res << endl;
}
return 0;
}