Advertisement
radmickey

Untitled

Jan 3rd, 2023
913
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct Node {
  4.     int value;
  5.     int parent_int;
  6.     int left_int;
  7.     int right_int;
  8.     Node* left;
  9.     Node* right;
  10.     Node* parent;
  11.  
  12.     Node() {
  13.         left = nullptr;
  14.         right = nullptr;
  15.         parent = nullptr;
  16.         left_int = 0;
  17.         right_int = 0;
  18.         parent_int = 0;
  19.     }
  20. };
  21.  
  22. void print(Node* tree) {
  23.     if (tree->left != nullptr) {
  24.         print(tree->left);
  25.     }
  26.     std::cout << tree->value << ' ';
  27.     if (tree->right != nullptr) {
  28.         print(tree->right);
  29.     }
  30. }
  31.  
  32. int main() {
  33.     int n;
  34.     int q;
  35.     std::cin >> n >> q;
  36.  
  37.     Node* tree[n + 1];
  38.  
  39.     Node** tree_ind = new Node*[n + 1];
  40.     tree_ind[0] = nullptr;
  41.  
  42.     for (int i = 0; i <= n; i++) {
  43.         tree[i] = new Node();
  44.     }
  45.  
  46.     for (int i = 1; i <= n; i++) {
  47.         tree_ind[i] = tree[i];
  48.         tree[i]->value = i;
  49.  
  50.         tree[i]->left_int = ((i*2 <=n) ? i * 2 : 0);
  51.         tree[i]->left = (tree[i]->left_int != 0 ? tree[tree[i]->left_int] : nullptr);
  52.  
  53.         tree[i]->right_int = ((i*2 + 1 <=n) ? i * 2 + 1 : 0);
  54.         tree[i]->right = (tree[i]->right_int != 0 ? tree[tree[i]->right_int] : nullptr);
  55.  
  56.         tree[tree[i]->right_int]->parent_int = i;
  57.         tree[tree[i]->right_int]->parent = tree[i];
  58.  
  59.         tree[tree[i]->left_int]->parent_int = i;
  60.         tree[tree[i]->left_int]->parent = tree[i];
  61.     }
  62.  
  63.     int x;
  64.     while (q--) {
  65.         std::cin >> x;
  66.         if (tree_ind[x]->parent == nullptr) {
  67.             continue;
  68.         }
  69.         Node* v = tree_ind[x];
  70.         Node* p = v->parent;
  71.         if (p->left == v) {
  72.             Node* pr = p->right;
  73.             Node* vr = v->right;
  74.             std::swap(v->value, p->value);
  75.             p->right = vr;
  76.             v->right = pr;
  77.  
  78.             if (vr != nullptr) {
  79.                 vr->parent = p;
  80.             }
  81.  
  82.             if (pr != nullptr) {
  83.                 pr->parent = v;
  84.             }
  85.  
  86.             tree_ind[p->value] = p;
  87.             tree_ind[v->value] = v;
  88.         } else {
  89.             Node* pl = p->left;
  90.             Node* vl = v->left;
  91.  
  92.             std::swap(p->value, v->value);
  93.             p->left = vl;
  94.             v->left = pl;
  95.  
  96.             if (pl != nullptr) {pl->parent = v;}
  97.  
  98.             if (vl != nullptr) {vl->parent = p;}
  99.  
  100.  
  101.             tree_ind[p->value] = p;
  102.             tree_ind[v->value] = v;
  103.         }
  104.     }
  105.     print(tree[1]);
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement