#include
using namespace std;
const int MAXN = 1e6 + 5;
int n, tree[MAXN][2], ans;
void dfs(int node, int dep) {
int x = tree[node][0], y = tree[node][1]; // 左子结点和右子结点
if(x == 0 && y == 0) { // 判断是否到了叶子结点
ans = max(ans, dep); // 将当前深度和变量ans中保存的之前的最大深度做比较
return; // 到达叶子结点便不再继续递归
}
dfs(x, dep + 1); // 递归左子树
dfs(y, dep + 1); // 递归右子数
}
int main() {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> tree[i][0] >> tree[i][1]; // 输入数据并存储
}
dfs(1, 1); // 从第一个结点开始,深度为1
cout << ans << endl;
return 0;
}