#include <algorithm> // max_element
#include <functional> // function
#include <iostream>
#include <iterator> // istream_iterator
#include <vector>
int main()
{
// get the number of nodes
size_t n;
if (!(std::cin >> n))
return 1;
// read nodes from stdin
std::istream_iterator<int> nodes{std::cin}, eof;
std::vector<int> a(nodes, eof); // a[i] is the parent of an i node, -1 is root
if (a.size() != n)
return 2;
// find all depths for each i node
std::vector<int> d(n); // d[i] -- depth of i node
std::function<int(size_t)> depth = [&](size_t i) -> int {
if (!d[i])
d[i] = (a[i] == -1) ? 1 : 1 + depth(a[i] - 1);
return d[i];
};
for (size_t i = 0; i < n; ++i)
depth(i);
// find max depth
auto it = std::max_element(std::begin(d), std::end(d));
std::cout << ((it == std::end(d)) ? 0 : *it);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIG1heF9lbGVtZW50CiNpbmNsdWRlIDxmdW5jdGlvbmFsPiAvLyBmdW5jdGlvbgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpdGVyYXRvcj4gICAvLyBpc3RyZWFtX2l0ZXJhdG9yCiNpbmNsdWRlIDx2ZWN0b3I+CgppbnQgbWFpbigpCnsKICAvLyBnZXQgdGhlIG51bWJlciBvZiBub2RlcwogIHNpemVfdCBuOwogIGlmICghKHN0ZDo6Y2luID4+IG4pKQogICAgcmV0dXJuIDE7CgogIC8vIHJlYWQgbm9kZXMgZnJvbSBzdGRpbgogIHN0ZDo6aXN0cmVhbV9pdGVyYXRvcjxpbnQ+IG5vZGVze3N0ZDo6Y2lufSwgZW9mOwogIHN0ZDo6dmVjdG9yPGludD4gYShub2RlcywgZW9mKTsgLy8gYVtpXSBpcyB0aGUgcGFyZW50IG9mIGFuIGkgbm9kZSwgLTEgaXMgcm9vdAogIGlmIChhLnNpemUoKSAhPSBuKQogICAgcmV0dXJuIDI7CgogIC8vIGZpbmQgYWxsIGRlcHRocyBmb3IgZWFjaCBpIG5vZGUKICBzdGQ6OnZlY3RvcjxpbnQ+IGQobik7IC8vIGRbaV0gLS0gZGVwdGggb2YgaSBub2RlCiAgc3RkOjpmdW5jdGlvbjxpbnQoc2l6ZV90KT4gZGVwdGggPSBbJl0oc2l6ZV90IGkpIC0+IGludCB7CiAgICBpZiAoIWRbaV0pCiAgICAgIGRbaV0gPSAoYVtpXSA9PSAtMSkgPyAxIDogMSArIGRlcHRoKGFbaV0gLSAxKTsKICAgIHJldHVybiBkW2ldOwogIH07CiAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpCiAgICBkZXB0aChpKTsKCiAgLy8gZmluZCBtYXggZGVwdGgKICBhdXRvIGl0ID0gc3RkOjptYXhfZWxlbWVudChzdGQ6OmJlZ2luKGQpLCBzdGQ6OmVuZChkKSk7CiAgc3RkOjpjb3V0IDw8ICgoaXQgPT0gc3RkOjplbmQoZCkpID8gMCA6ICppdCk7Cn0=