#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long double pi = acos(-1);
const int MOD = 1e9 + 7;
vector<int> resp;
int dfs(int atual, vector<int> &abaixo, vector<vector<int> > &graph,
        vector<int> &melhorfilho) {
  int ret = 1;
  for (int v : graph[atual]) {
    ret += dfs(v, abaixo, graph, melhorfilho);
    melhorfilho[atual] = max(melhorfilho[atual], abaixo[v]);
  }
  return abaixo[atual] = ret;
}
map<int, int> mapa;
void solve(int atual, vector<int> &abaixo, vector<vector<int> > &graph,
           vector<int> &melhorfilho) {
  mapa[abaixo[atual]] = atual;
  for (auto it = mapa.lower_bound(2 * melhorfilho[atual]);
       it != mapa.end() and it->first / 2 <= abaixo[atual];) {
    int quemtem = it->second;
    resp[quemtem] = atual + 1;
    it = mapa.erase(it);
  }
  for (int v : graph[atual]) solve(v, abaixo, graph, melhorfilho);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<int> level(n, 0);
  vector<vector<int> > graph(n);
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    x--;
    graph[x].push_back(i - 1);
  }
  vector<int> abaixo(n, 0);
  resp.assign(n, 0);
  vector<int> melhorfilho(n, 0);
  dfs(0, abaixo, graph, melhorfilho);
  solve(0, abaixo, graph, melhorfilho);
  for (int i = 0; i < m; i++) {
    int x;
    cin >> x;
    x--;
    printf("%d\n", resp[x]);
  }
  return 0;
}
