金币
题号:NC20908
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

给定一个森林,森林中的每棵树上的每个点都有一枚金币。悲惨的是,每个点最多只能容纳一枚金币。如果一个点有偶数枚金币,所有的金币都会消失。如果一个点有奇数枚金币,则只会留下一枚金币。
由于重力作用,每秒钟所有点上的金币都会向下移动 1 个单位(即到它的父亲节点处)。假设您目前在树根的位置观看金币下落,请问您最后能在每棵树的树根处捡到最多的金币,捡到的金币枚数是多少?

输入描述:

第一行一个整数 n(2≤n≤106)。表示森林中的点的个数。
第二行包含一个由 n 个数组成的序列(每个数保证在 0 到 n 之间)。序列中的第 i 个数表示第 i 个点的父亲。特别地,当数列中的一个数 pi=0时,则说明它是森林中某一棵树的根。

输出描述:

一行若干个整数,表示在每棵树的树根处能捡到的金币枚数(请按输入顺序输出每一个树根的答案,即若有很多棵树,请按输入的顺序依次输出每一个树根的答案)。
示例1

输入

复制
18
0 1 1 1 4 4 3 2 2 2 10 8 9 9 9 10 10 4

输出

复制
4

说明

下图所示为样例中树的初始形态。