import heapq, math
from itertools import *
from bisect import *
from collections import *
from sys import stdin, stdout
###########-> Templates <- ##########
def pr(out):
return stdout.write(f"{out}\n")
def input():
return stdin.readline().rstrip()
def int_inp():
return int(input())
def inp_int_l():
return list(map(int, stdin.readline().split()))
def inp_l():
return stdin.readline().split()
####################################
def solve():
n = int(input())
graph = [[] for _ in range(n)]
indegree = [0] * n
for node in range(n):
p = int_inp()
if p != -1:
graph[p - 1].append(node)
indegree[node] += 1
level = [[node for node in range(n) if indegree[node] == 0]]
queue = deque(level[0])
while queue:
lev = []
for _ in range(len(queue)):
node = queue.popleft()
for nei in graph[node]:
lev.append(nei)
queue.append(nei)
level.append(lev)
count = 0
for l in level:
if l:
count += 1
print(count)
if __name__ == "__main__":
t = 1
for _ in range(t):
solve()