int n, ans, x; int d[kMaxN], dep[kMaxN]; std::vector<int> G[kMaxN], f[kMaxN];
voiddfs1(int u, int fa){ dep[u] = dep[fa] + 1; if (G[u].size() != 1) d[u] = 1e9; for (auto v : G[u]) { if (v == fa) continue; dfs1(v, u); d[u] = std::min(d[u], d[v] + 1); } }
voiddfs2(int u, int fa){ for (auto v : G[u]) { if (v == fa) continue; d[v] = std::min(d[v], d[u] + 1); dfs2(v, u); } }
voidmerge(int u, int v){ for (int i = 0; i < static_cast<int>(f[v].size()); ++i) { for (;;) { int j = std::max(ans - x - i + 1, 0); if (j < static_cast<int>(f[u].size()) && f[v][i] + f[u][j] - 2 * dep[u] > ans) ++ans; elsebreak; } } for (int i = 0; i < static_cast<int>(f[v].size()); ++i) f[u][i] = std::max(f[u][i], f[v][i]); }
voiddfs3(int u, int fa){ int mxid = 0; for (auto v : G[u]) { if (v == fa) continue; dfs3(v, u); if (f[v].size() > f[mxid].size()) mxid = v; } std::swap(f[u], f[mxid]); for (auto v : G[u]) { if (v == fa || v == mxid) continue; merge(u, v); } for (;;) { int i = std::max(ans - x - d[u] + 1, 0); if (i < static_cast<int>(f[u].size()) && f[u][i] - dep[u] > ans) ++ans; elsebreak; } if (d[u] == static_cast<int>(f[u].size())) f[u].emplace_back(dep[u]); }
voiddickdreamer(){ std::cin >> n; for (int i = 2; i <= n; ++i) { int p; std::cin >> p; G[p].emplace_back(i), G[i].emplace_back(p); } dfs1(1, 0), dfs2(1, 0); int q; std::cin >> q; for (; q; --q) { std::cin >> x; for (int i = 1; i <= n; ++i) { f[i].clear(), f[i].shrink_to_fit(); } ans = 0; dfs3(1, 0); std::cout << ans << ' '; } }