#include #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define forn(i, n) for (int i = 0; i < (int)(n); ++i) #define for1(i, n) for (int i = 1; i <= (int)(n); ++i) #define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i) #define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i) template bool umin(T &a, T b) { return a > b ? (a = b, true) : false; } template bool umax(T &a, T b) { return a < b ? (a = b, true) : false; } using namespace std; int main(int argc, char** argv) { int N, M = 1, act; scanf("%d", &N); vector v(N); while ((1 << M) < N) ++M; vector > par(N, vector(M + 1, -1)); vector > ch(N); vector used(N); int r = 0; forn(i, N) { scanf("%d", &par[i][0]); --par[i][0]; if (par[i][0] > -1) ch[par[i][0]].push_back(i); else r = i; } used[r] = true; vector q(1, r); forn(i, N) { int actq = q[i]; forn(j, ch[actq].size()) { int cand = ch[actq][j]; if (!used[cand]) { used[cand] = true; q.push_back(cand); } } forn(j, M) if (par[actq][j] != -1) { par[actq][j + 1] = par[par[actq][j]][j]; } } forn(q, N) { scanf("%d", &act); --act; int ans = (v[act] ? 0 : 1); while (par[act][0] != -1 && !v[par[act][0]]) { int w = 0; while (par[act][w + 1] != -1 && !v[par[act][w + 1]]) ++w; ans += (1 << w); act = par[act][w]; if (w == 0) break; } v[act] = true; printf("%d\n", ans); } return 0; }