#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
    int val;
    struct TreeNode *left, *right;
} TreeNode;
TreeNode* newNode(int val) {
    if (val == -1) return NULL;  // null
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = val;
    node->left = node->right = NULL;
    return node;
}
typedef struct {
    TreeNode* data[10005];
    int front, rear;
} Queue;

void initQueue(Queue* q) {
    q->front = q->rear = 0;
}
int isEmpty(Queue* q) {
    return q->front == q->rear;
}
void enqueue(Queue* q, TreeNode* node) {
    q->data[q->rear++] = node;
}
TreeNode* dequeue(Queue* q) {
    return q->data[q->front++];
}
TreeNode* buildTree(int arr[], int n) {
    if (n == 0 || arr[0] == -1) return NULL;

    TreeNode* root = newNode(arr[0]);
    Queue q;
    initQueue(&q);
    enqueue(&q, root);

    int i = 1;
    while (!isEmpty(&q) && i < n) {
        TreeNode* curr = dequeue(&q);
        if (curr) {
            // Left
            if (i < n) {
                curr->left = newNode(arr[i]);
                if (curr->left) enqueue(&q, curr->left);
                i++;
            }
            if (i < n) {
                curr->right = newNode(arr[i]);
                if (curr->right) enqueue(&q, curr->right);
                i++;
            }
        }
    }
    return root;
}
int diameter = 0;
int height(TreeNode* root) {
    if (!root) return 0;
    int lh = height(root->left);
    int rh = height(root->right);
    if (lh + rh > diameter) diameter = lh + rh;
    return (lh > rh ? lh : rh) + 1;
}

int main() {
    int n;
    scanf("%d", &n);

    if (n <= 0) {
        printf("0\n");
        return 0;
    }

    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    TreeNode* root = buildTree(arr, n);
    height(root);
    printf("%d\n", diameter);

return 0;
}#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
    int val;
    struct TreeNode *left, *right;
} TreeNode;
TreeNode* newNode(int val) {
    if (val == -1) return NULL;  // null
    TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
    node->val = val;
    node->left = node->right = NULL;
    return node;
}
typedef struct {
    TreeNode* data[10005];
    int front, rear;
} Queue;

void initQueue(Queue* q) {
    q->front = q->rear = 0;
}
int isEmpty(Queue* q) {
    return q->front == q->rear;
}
void enqueue(Queue* q, TreeNode* node) {
    q->data[q->rear++] = node;
}
TreeNode* dequeue(Queue* q) {
    return q->data[q->front++];
}
TreeNode* buildTree(int arr[], int n) {
    if (n == 0 || arr[0] == -1) return NULL;

    TreeNode* root = newNode(arr[0]);
    Queue q;
    initQueue(&q);
    enqueue(&q, root);

    int i = 1;
    while (!isEmpty(&q) && i < n) {
        TreeNode* curr = dequeue(&q);
        if (curr) {
            // Left
            if (i < n) {
                curr->left = newNode(arr[i]);
                if (curr->left) enqueue(&q, curr->left);
                i++;
            }
            if (i < n) {
                curr->right = newNode(arr[i]);
                if (curr->right) enqueue(&q, curr->right);
                i++;
            }
        }
    }
    return root;
}
int diameter = 0;
int height(TreeNode* root) {
    if (!root) return 0;
    int lh = height(root->left);
    int rh = height(root->right);
    if (lh + rh > diameter) diameter = lh + rh;
    return (lh > rh ? lh : rh) + 1;
}

int main() {
    int n;
    scanf("%d", &n);

    if (n <= 0) {
        printf("0\n");
        return 0;
    }

    int arr[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    TreeNode* root = buildTree(arr, n);
    height(root);
    printf("%d\n", diameter);

return 0;
}