#include <bits/stdc++.h>
 
using namespace std;
 
struct Node {
    int data;
    Node *left;
    Node *right;
};
 
struct TreeList {
    Node *root;
 
    Node *generate_tree(vector<int> data, size_t start, size_t end) {
        if (start >= end) {
            return new Node{data[start], nullptr, nullptr};
        }
        size_t mid = (start + end) / 2;
        Node *node = new Node();
        node->data = data[mid];
        node->left = generate_tree(data, start, mid - 1);
        node->right = generate_tree(data, mid + 1, end);
        return node;
    }
 
    TreeList() { root = nullptr; }
 
    TreeList(vector<int> data) {
        root = generate_tree(data, 0, data.size() - 1);
    }
 
    void delete_tree(Node *node) {
        if (node == nullptr) {
            return;
        }
        delete_tree(node->left);
        delete_tree(node->right);
        delete node;
    }
 
    ~TreeList() { delete_tree(root); }
 
    void pre_print_tree(Node *node, size_t level) {
        if (node == nullptr) {
            return;
        }
        cout << node->data << " " << level << endl;
        pre_print_tree(node->left, level + 1);
        pre_print_tree(node->right, level + 1);
    }
};
 
int main() {
    TreeList tree{{1, 2, 3, 4, 5, 6, 7}};
    tree.pre_print_tree(tree.root, 0);
    return 0;
}