Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <set>
- using namespace std;
- const int N = 1e6 + 228;
- const int K = 20;
- int up[N][K];
- int tin[N], h[N];
- int timer = 0;
- vector<int> G[N];
- void dfs(int v) {
- tin[v] = timer++;
- for (int i : G[v])
- dfs(i);
- }
- int la(int a, int level) {
- for (int i = K - 1; i >= 0; --i) {
- if (level >= (1 << i))
- level -= (1 << i), a = up[a][i];
- }
- return a;
- }
- int lca(int a, int b) {
- if (h[a] > h[b])
- swap(a, b);
- b = la(b, h[b] - h[a]);
- if (a == b)
- return a;
- for (int i = K - 1; i >= 0; --i) {
- if (up[a][i] != up[b][i])
- a = up[a][i], b = up[b][i];
- }
- return up[a][0];
- }
- void solve() {
- int n;
- cin >> n;
- timer = 0;
- for (int i = 0; i <= n; ++i)
- G[i].clear();
- G[0].push_back(1);
- up[1][0] = 0, h[1] = 1;
- for (int i = 2; i <= n; ++i) {
- int a;
- cin >> a;
- G[a].push_back(i);
- up[i][0] = a, h[i] = h[a] + 1;
- }
- dfs(0);
- for (int k = 1; k < K; ++k) {
- for (int i = 0; i <= n; ++i) {
- up[i][k] = up[up[i][k - 1]][k - 1];
- }
- }
- vector<set<pair<int, int>>> who(n + 1);
- for (int i = 0; i <= n; ++i) {
- who[i].emplace(-1, 0);
- who[i].emplace(n + 3, 0);
- }
- cout << 0 << ' ';
- int cnt_leaf = 0;
- long long val = 0;
- vector<int> leaf(n + 1);
- for (int i = 2; i <= n; ++i) {
- auto z = who[h[i]].lower_bound(make_pair(tin[i], i));
- int v = lca(z->second, i), _v = lca((--z)->second, i);
- if (h[_v] > h[v])
- swap(_v, v);
- val += 2 * (h[i] - h[v] - 1);
- ++cnt_leaf;
- if (leaf[up[i][0]]) {
- leaf[up[i][0]] = 0;
- --cnt_leaf;
- }
- leaf[i] = 1;
- who[h[i]].emplace(tin[i], i);
- cout << val - i + cnt_leaf << ' ';
- }
- cout << '\n';
- }
- int main() {
- int t;
- cin >> t;
- while (t--)
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement