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 
import java.util.*;
public class Graph {
    
    
   static  LinkedList<Integer> adj[];
    
   
    int V;
  static   boolean s=false;
    static     int arr[];
       static  int arr1[];
       
       static int max=Integer.MIN_VALUE;
    
     Graph(int n)
    {
            
            V=n;
          
          adj=new LinkedList[V+1];
          
          
          for(int i=1;i<=V;i++)
          {
              adj[i]=new LinkedList();
          }
        
        
    }
    
    
    void addEdge(int i,int j)
    {
        adj[i].add(j);
    }
    
    
    
    
    void Dfs(int i,boolean visited[],int count)
    {
        
        visited[i]=true;
        
        
        
        for(Integer j: adj[i])
        {
            if(!visited[j])
           
            {
                  count++;
                Dfs(j,visited,count);
              
            }
        }
        
        
        max=Math.max(count,max);
        
    }
    
    
    
    
    
    
    public static void main(String args[]){
        
        Scanner sc=new Scanner(System.in);
        
        
        int n=sc.nextInt();
       // int element=sc.nextInt();
         Graph graph=new Graph(n);
         graph.arr=new int[n+1];
   
       
       
        for(int i=1;i<=n;i++)
        {
            arr[i]=sc.nextInt();
        }
        
   
        
        for(int i=1;i<=n;i++)

            {
            
            if(arr[i]!=-1)
            {
                graph.addEdge(i,arr[i]);
            }
            
                
            }
        
        
           
            // for(int i=1;i<=n;i++)
            // {
            //     System.out.print(i+"->");
                
                
            //     for(Integer j:adj[i])
            //     {
            //         System.out.print(j + " ");
            //     }
            //     System.out.println();
                
                
                
            // }
           
        boolean visited[];
  
           for(int i=1;i<=n;i++)
           {
               
               visited=new boolean[n+1];
               int count=1;
               graph.Dfs(i,visited,count);
               
           }
           
           
          System.out.println(max);
          
            // graph.Dfs(1,element);
            // if(!s)
            // {
                
                    
            // System.out.println("NO");        
                    
            // }
       
        
        
        
        
        
        
        
    }
}