// editor5
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int val;
    struct Node *left, *right;
} Node;

// Function to create a new node
Node* newNode(int val) {
    if (val == -1) return NULL;
    Node* node = (Node*)malloc(sizeof(Node));
    node->val = val;
    node->left = node->right = NULL;
    return node;
}

// Build tree from level order input
Node* buildTree(int arr[], int n) {
    if (n == 0 || arr[0] == -1) return NULL;
    
    Node** nodes = (Node*)malloc(n * sizeof(Node));
    for (int i = 0; i < n; i++) {
        nodes[i] = newNode(arr[i]);
    }
    
    for (int i = 0; i < n; i++) {
        if (nodes[i] != NULL) {
            int leftIndex = 2*i + 1;
            int rightIndex = 2*i + 2;
            if (leftIndex < n) nodes[i]->left = nodes[leftIndex];
            if (rightIndex < n) nodes[i]->right = nodes[rightIndex];
        }
    }
    
    Node* root = nodes[0];
    free(nodes);
    return root;
}

int max(int a, int b) {
    return (a > b) ? a : b;
}

// Compute diameter
int diameterUtil(Node* root, int* diameter) {
    if (root == NULL) return 0;
    
    int left = diameterUtil(root->left, diameter);
    int right = diameterUtil(root->right, diameter);
    
    // Update maximum diameter
    if (*diameter < left + right)
        *diameter = left + right;
    
    // Return height
    return max(left, right) + 1;
}

int diameter(Node* root) {
    int d = 0;
    diameterUtil(root, &d);
    return d;
}

int main() {
    int N;
    scanf("%d", &N);
    
    if (N <= 0) {
        printf("Invalid input\n");
        return 0;
    }
    
    int arr[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    
    Node* root = buildTree(arr, N);
    printf("%d\n", diameter(root));
    
return 0;
}