动态树
题号:NC264025
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

树是一张无向图,其中任意两点间的简单路径有且只有一条。

最初,树只有一个节点,编号为 1。但树是可以生长的,所以你决定观察一棵树的生长全程。

树会生长 n 次。在第 i 次生长时,会指定一个已经存在的节点,编号为 p_i,并将编号为 i + 1 的节点直接连接到编号为 p_i 的节点上。

一棵树的直径是指树上任意两点间的简单路径中,经过的边数最多的一条路径。特别地,两个相同节点之间的简单路径经过的边数为 0

我们认为,树的直径可以反映它的健康状况:如果一棵树的直径只有一条,我们就认为它是健康的,否则认为它需要被剪枝。显然,最初的树是健康的。

请你仔细观察这棵树的生长全程,找到一个最小的 k,满足这棵树在第 k 次生长之后变得不健康

输入描述:

输入的第一行为一个正整数 n (1 \leq n \leq 2 \cdot 10^5),表示树生长的次数。

接下来一行 n 个空格分隔的正整数 p_i (1 \leq p_i \leq i),含义如题目描述中所示。

输出描述:

输出一行一个整数表示答案。

如果不存在这样的 k,即树的生长全程都是健康的,则输出一行一个整数 -1
示例1

输入

复制
4
1 1 1 1

输出

复制
3

说明

在第 3 次生长后,树的形态如图所示:



示例2

输入

复制
5
1 1 2 3 1

输出

复制
-1

备注: