A company has n employees numbered from 1 to n. Each employee either has no immediate manager or exactly one immediate manager, who is another employee with a different number. An employee A is said to be the superior of another employee B if at least one of the following is true:

  * Employee A is the immediate manager of employee B
  * Employee B has an immediate manager employee C such that employee A is the superior of employee C. 



The company will not have a managerial cycle. That is, there will not exist an employee who is the superior of his/her own immediate manager.

Today the company is going to arrange a party. This involves dividing all n employees into several groups: every employee must belong to exactly one group. Furthermore, within any single group, there must not be two employees A and B such that A is the superior of B.

What is the minimum number of groups that must be formed?

Input

The first line contains integer n (1 ≤ n ≤ 2000) — the number of employees.

The next n lines contain the integers pi (1 ≤ pi ≤ n or pi = -1). Every pi denotes the immediate manager for the i-th employee. If pi is -1, that means that the i-th employee does not have an immediate manager. 

It is guaranteed, that no employee will be the immediate manager of him/herself (pi ≠ i). Also, there will be no managerial cycles.

Output

Print a single integer denoting the minimum number of groups that will be formed in the party.

Examples

Input

5
-1
1
2
1
-1


Output

3

Note

For the first example, three groups are sufficient, for example: 

  * Employee 1 
  * Employees 2 and 4 
  * Employees 3 and 5 
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class Main
{
	static int[][] data;
	static int[] vis;
	static int[] dis;
	static int max;
	static void BFS(int s)
	{
		LinkedList<Integer> mQueue = new LinkedList<Integer>();
		mQueue.addLast(s);
		dis[s] = 0;
		if(dis[s] > max)
			max = dis[s];
		while (mQueue.size() > 0)
		{
			int id = mQueue.pollFirst();
			if(vis[id] == 1)
				continue;
			for(int i = 1; i < data[0].length; i++)
			{
				if(data[id][i] == 0 || vis[i] == 1)
					continue;
				mQueue.addLast(i);
				if (dis[i] == -1)
					dis[i] = dis[id]+1;
				if(dis[i] > max)
					max = dis[i];
			}
			vis[id] = 1;
		}
	}
	public static void main (String[] args) throws java.lang.Exception
	{
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		data = new int[n+1][n+1];
		vis = new int[n+1];
		dis = new int[n+1];
		Arrays.fill(dis,-1);
		max = Integer.MIN_VALUE;
		LinkedList<Integer> root = new LinkedList<Integer>();
		for(int i = 1; i < n+1; i++)
		{
			int c = in.nextInt();
			if(c == -1)
				root.addLast(i);
			else
			{
				data[c][i] = 1;
				data[i][c] = 1;
			}
		}
		while (root.size() > 0)
		{
			int r = root.pollFirst();
			BFS(r);
			
		}
		System.out.println(max+1);
		//p(data);
		
	}
	static void p(int[][] y)
	{
		for(int i = 1; i < y[0].length;i++)
		{
			for(int j = 1; j < y[0].length;j++)
				System.out.print(" "+y[i][j]);
			
			System.out.println("");
		}
	}
}