func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 5;   int n, T, A[N], ch[N][26], son[N], fa[N], sz[N], m, tail[N], tg[N], ans[N],       dfn[N], idx, top[N];   int MN[N], out[N];   struct smt {     int t[N << 2], tag[N << 2];     void build(int l, int r, int p) {       if (l == r) {         t[p] = 0x3f3f3f3f;         return;       }       int mid = l + r >> 1;       build(l, mid, p << 1);       build(mid + 1, r, p << 1 | 1);       t[p] = min(t[p << 1], t[p << 1 | 1]);     }     inline void pushdown(int p) {       if (tag[p]) {         tag[p << 1] += tag[p];         tag[p << 1 | 1] += tag[p];         t[p << 1] += tag[p];         t[p << 1 | 1] += tag[p];         tag[p] = 0;       }     }     void modify(int l, int r, int o, const int& pos, const int& val) {       if (l == r)         t[o] = min(t[o], val);       else {         const int mid = l + r >> 1;         pushdown(o);         if (pos <= mid)           modify(l, mid, o << 1, pos, val);         else           modify(mid + 1, r, o << 1 | 1, pos, val);         t[o] = min(t[o << 1], t[o << 1 | 1]);       }     }     void change(int l, int r, int a, int b, int p, int v) {       if (a <= l && r <= b) {         tag[p] += v, t[p] += v;         return;       }       pushdown(p);       int mid = l + r >> 1;       if (a <= mid) change(l, mid, a, b, p << 1, v);       if (b > mid) change(mid + 1, r, a, b, p << 1 | 1, v);       t[p] = min(t[p << 1], t[p << 1 | 1]);     }     int query(int l, int r, int o, const int& L, const int& R) {       if (L <= l && r <= R) return t[o];       pushdown(o);       const int mid = l + r >> 1;       if (L <= mid && mid < R)         return min(query(l, mid, o << 1, L, R),                    query(mid + 1, r, o << 1 | 1, L, R));       if (L <= mid) return query(l, mid, o << 1, L, R);       return query(mid + 1, r, o << 1 | 1, L, R);     }     inline void out(int l, int r, int o) {       if (l == r)         cout << t[o] <<    ;       else {         pushdown(o);         const int mid = l + r >> 1;         out(l, mid, o << 1), out(mid + 1, r, o << 1 | 1);       }     }   } sgt;   void dfs(int now) {     sz[now] = 1;     for (int i = 0; i < 26; ++i)       if (int to = ch[now][i]) {         dfs(to);         sz[now] += sz[to];         if (!son[now] || sz[son[now]] < sz[to]) son[now] = to;       }   }   void dfs2(int now) {     dfn[now] = idx++;     if (son[now]) top[son[now]] = top[now], dfs2(son[now]);     for (int i = 0; i < 26; ++i) {       int to = ch[now][i];       if (to && to != son[now]) dfs2(top[to] = to);     }   }   void add(int x) {     while (top[x] != top[0])       sgt.change(0, n, dfn[top[x]], dfn[x], 1, 1), x = fa[top[x]];     sgt.change(0, n, 0, dfn[x], 1, 1);   }   int query(int x) {     int ret = 0x3f3f3f3f;     while (top[x] != top[0])       ret = min(ret, sgt.query(0, n, 1, dfn[top[x]], dfn[x])), x = fa[top[x]];     ret = min(ret, sgt.query(0, n, 1, 0, dfn[x]));     return ret;   }   void DFS(int now) {     sgt.modify(0, n, 1, dfn[now], MN[now] + !!tg[now]);     for (int i = 0; i < 26; ++i)       if (int to = ch[now][i]) {         MN[to] = min(MN[to], MN[now] + 1);         if (tg[to]) {           add(to);           MN[to] = min(MN[to], query(to));         }         DFS(to);       }   }   int main() {     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);     cin >> n;     for (int i = 1; i <= n; ++i) {       int pre;       char s[12];       cin >> pre >> s;       fa[i] = pre;       ch[pre][*s -  a ] = i;     }     cin >> m;     for (int i = 1; i <= m; ++i) {       int x;       cin >> x;       tg[x] = i;     }     dfs(0), dfs2(0);     sgt.build(0, n, 1);     memset(MN, 0x3f, sizeof MN);     MN[0] = 0;     DFS(0);     for (int i = 0; i <= n; ++i)       if (tg[i]) out[tg[i]] = MN[i];     for (int i = 1; i <= m; ++i) cout << out[i] <<    ;     return 0;   }   