#include <iostream>

struct Node {
  int data;
  Node* left;
  Node* right;

  Node(int value) : data(value), left(nullptr), right(nullptr) {}
};

struct BST {
  Node* top = nullptr;

  Node* insert(Node* root, int value) {
    if (root == nullptr) {
        return new Node(value);
    }
    if (value < root->data) {
      root->left = insert(root->left, value);
    } else if (value > root->data) {
      root->right = insert(root->right, value);
    }
    return root;
  }

  Node* findMin(Node* root) {
    while (root && root->left != nullptr) {
      root = root->left;
    }
    return root;
  }

  Node* pop(Node* root, int value) {
    if (root == nullptr) return nullptr;

    if (value < root->data) {
      root->left = pop(root->left, value);
    } else if (value > root->data) {
      root->right = pop(root->right, value);
    } else {
      if (root->left == nullptr) {
        Node* temp = root->right;
        delete root;
        return temp;
      } else if (root->right == nullptr) {
        Node* temp = root->left;
        delete root;
        return temp;
      }
      Node* temp = findMin(root->right);
      root->data = temp->data;
      root->right = pop(root->right, temp->data);
    }
    return root;
  }

  void inorder(Node* root) {
    if (root == nullptr) return;
    
    inorder(root->left);
    std::cout << root->data << " ";
    inorder(root->right);
  }

  void clear(Node* root) {
    if (root == nullptr) return;

    clear(root->left);
    clear(root->right);
    delete root;
  }

  void merge(BST& other) {
    merge(top, other.top);
    clear(other.top);
    other.top = nullptr;
  }

  void merge(Node*& root1, Node* root2) {
    if (root2 == nullptr) return;
    
    merge(root1, root2->left);
    root1 = insert(root1, root2->data);
    merge(root1, root2->right);
  }
};


int main() {
  int n;
  std::cin >> n;
  std::string cmd;
  int acc;
  int id;
  BST arr[2];

  for (int i = 0; i < n; ++i) {
    std::cin >> cmd;
    if (cmd == "merge") {
      arr[0].merge(arr[1]);
      arr[0].inorder(arr[0].top);
      std::cout << '\n';
    } else if (cmd == "buy") {
      std::cin >> acc >> id;
      arr[acc - 1].top = arr[acc - 1].insert(arr[acc - 1].top, id);
    } else if (cmd == "sell") {
      std::cin >> acc >> id;
      arr[acc - 1].top = arr[acc - 1].pop(arr[acc - 1].top, id);
    }
  }
}


Недавно вошедшие в список форбс 24 до 24-ех Леонид и Семен решили открыть новый бизнес. Для этого они нашли знаменитую предпринимательницу Лизу, которая стала спонсором их стартапа. Для успешного трейдинга ребята создали один основной аккаунт и один дополнительный.

Для хорошей отчестности перед инвестором все рискованные сделки они проводят со второго аккаунта. Как только второй аккаунт выходит в положительный баланс, то ребята сливают все акции на основной аккаунт, а второй портфель очищается.

Вы 
−
− первый разработчик в их стартапе, перед Вами стоит сложная задача реализации придуманной Семой и Лёвой системы.

С аккаунтами могут происходить следующие операции:

buy 
�
�
�
�
�
�
�
account 
�
�
id 
−
− купить акции с номером 
�
�
id в портфель 
�
�
�
�
�
�
�
account (может быть для обоих аккаунтов)

sell 
�
�
�
�
�
�
�
account 
�
�
id 
−
− продать акции с номером 
�
�
id в портфели 
�
�
�
�
�
�
�
account (может быть для обоих аккаунтов)

merge 
−
− сливать все акции в основной портфель

После каждого объединения товарищи проводят показ результатов Лизе, поэтому при этой операции требуется выводить 
�
�
id акций в отсортированном виде.

Входные данные

В первой строке подается 
�
n 
−
− число операций 
1
≤
�
≤
1
0
7
1≤n≤10 
7
 

В следующих n строках подаются команды одного из 3 видов (buy, sell, merge) Гарантируется, что номер акции: 
0
≤
�
�
≤
1
0
9
0≤id≤10 
9
 

Выходные данные

При каждой операции merge вывести 
�
�
id акции в отсортированном виде


почему то не проходит самый первый тест испарвь