#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int val;
    struct Node *left, *right;
} Node;

// Create a new node or return NULL if value is -1
Node* createNode(int val) {
    if (val == -1) return NULL;
    Node* node = (Node*)malloc(sizeof(Node));
    node->val = val;
    node->left = node->right = NULL;
    return node;
}

// Given level order array, build the binary tree
Node* buildTree(int nodes[], int n) {
    if (n <= 0 || nodes[0] == -1) return NULL;

    Node *treeNodes = (Node)malloc(n * sizeof(Node));
    for (int i = 0; i < n; i++) {
        treeNodes[i] = createNode(nodes[i]);
    }

    for (int i = 0, j = 1; j < n; i++) {
        if (treeNodes[i] != NULL) {
            if (j < n) treeNodes[i]->left = treeNodes[j++];
            if (j < n) treeNodes[i]->right = treeNodes[j++];
        }
    }

    Node* root = treeNodes[0];
    free(treeNodes);
    return root;
}

// Helper function to compute diameter and height simultaneously
int diameterHelper(Node* root, int *diameter) {
    if (!root) return 0;
    int leftHeight = diameterHelper(root->left, diameter);
    int rightHeight = diameterHelper(root->right, diameter);

    // Update the diameter if the path through this node is longer
    if (leftHeight + rightHeight > *diameter) {
        *diameter = leftHeight + rightHeight;
    }

    // Height of current node
    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

int main() {
    int n;
    scanf("%d", &n);
    if (n <= 0) {
        printf("Invalid input\n");
        return 0;
    }

    int nodes[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &nodes[i]);
    }

    Node* root = buildTree(nodes, n);

    int diameter = 0;
    diameterHelper(root, &diameter);

    printf("%d\n", diameter);

     return 0;
}