#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ii = pair<int, int>;
const int N = 1000006;
int trie[N][30];
bool good[N];
int ans[N];
template <typename T>
class minQ {
  list<int> p;
  T delta;
  int sz;

 public:
  minQ() : delta(0), sz(0) {}
  inline int size() const { return sz; }
  inline void add(T x) { delta += x; }
  inline void push(T x) {
    x -= delta;
    p.emplace_back(min(x, getmin() - delta));
    sz++;
  }
  inline void pop() { p.pop_back(); }
  T getmin() const { return sz == 0 ? N : p.back() + delta; }
};
minQ<int> q;
void dfs(int x) {
  if (good[x]) {
    ans[x] = min(ans[x], q.getmin());
  }
  q.push(ans[x] + 1);
  if (good[x]) {
    q.add(1);
  }
  for (int i = 0; i < 30; i++) {
    if (trie[x][i]) {
      ans[trie[x][i]] = ans[x] + 1;
      dfs(trie[x][i]);
    }
  }
  q.pop();
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int x;
    char c;
    scanf("%d %c", &x, &c);
    c -= 'a';
    trie[x][c] = i + 1;
  }
  int k;
  int v[N];
  scanf("%d", &k);
  for (int i = 0; i < k; i++) {
    scanf("%d", v + i);
    good[v[i]] = 1;
  }
  ans[0] = 0;
  dfs(0);
  for (int i = 0; i < k; i++) {
    printf("%d ", ans[v[i]]);
  }
  printf("\n");
}
