#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int value;
    struct Node* left;
    struct Node* right;
} Node;

Node* createNode(int val) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->value = val;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

void mirror(Node* root) {
    if (!root) return;
    Node* temp = root->left;
    root->left = root->right;
    root->right = temp;
    mirror(root->left);
    mirror(root->right);
}

void inorder(Node* root) {
    if (!root) return;
    inorder(root->left);
    printf("%d ", root->value);
    inorder(root->right);
}

void printTree(Node** nodes, int n) {
    for (int i = 1; i <= n; i++) {
        int leftVal = nodes[i]->left ? nodes[i]->left->value : -1;
        int rightVal = nodes[i]->right ? nodes[i]->right->value : -1;
        printf("%d %d %d\n", nodes[i]->value, leftVal, rightVal);
    }
}

int main() {
    int N;
    if (scanf("%d", &N) != 1 || N < 1 || N > 10000) {
        printf("Invalid input\n");
        return 0;
    }

    int* order = (int*)malloc(sizeof(int) * N);
    int maxVal = 0;

    for (int i = 0; i < N; i++) {
        if (scanf("%d", &order[i]) != 1 || order[i] < 1 || order[i] > 100000) {
            printf("Invalid input\n");
            free(order);
            return 0;
        }
        if (order[i] > maxVal) maxVal = order[i];
    }

    // Array of pointers for nodes
    Node** nodes = (Node**)calloc(maxVal + 1, sizeof(Node*));
    int* isChild = (int*)calloc(maxVal + 1, sizeof(int));
    for (int i = 1; i <= N;