Advertisement
radmickey

Untitled

Feb 13th, 2023
885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include <bits/stdc++.h>
  6.  
  7.  
  8. struct Node {
  9.     int value;
  10.     Node* left;
  11.     Node* right;
  12.     Node* parent;
  13.     int left_int;
  14.     int right_int;
  15.  
  16.     Node() {
  17.         left = nullptr;
  18.         right = nullptr;
  19.         parent = nullptr;
  20.         left_int = 0;
  21.         right_int = 0;
  22.     }
  23. };
  24.  
  25. struct Node_char {
  26.     char value;
  27.     Node_char* left;
  28.     Node_char* right;
  29.     Node_char* parent;
  30.     int left_int;
  31.     int right_int;
  32.  
  33.     Node_char() {
  34.         left = nullptr;
  35.         right = nullptr;
  36.         parent = nullptr;
  37.         left_int = 0;
  38.         right_int = 0;
  39.     }
  40. };
  41.  
  42.  
  43. void print(Node* tree, std::vector<int>& vector) {
  44.     if (tree->left != nullptr) {
  45.         print(tree->left, vector);
  46.     }
  47.     if (tree->right != nullptr) {
  48.         print(tree->right, vector);
  49.     }
  50.     vector.push_back(tree->value);
  51.     delete tree;
  52. }
  53.  
  54. void print_char(Node_char* tree, std::vector<char>& vector) {
  55.     if (tree->left != nullptr) {
  56.         print_char(tree->left, vector);
  57.     }
  58.     if (tree->right != nullptr) {
  59.         print_char(tree->right, vector);
  60.     }
  61.     vector.push_back(tree->value);
  62.     delete tree;
  63. }
  64.  
  65.  
  66. std::vector<int> solve(int file) {
  67. //    std::ifstream in(std::to_string(file));
  68.  
  69.     int n;
  70.     int q;
  71.  
  72. //    std::cin >> n >> q;
  73.  
  74.     std::cin >> n >> q;
  75.  
  76.     Node** tree = new Node*[n + 1];
  77.     std::unordered_map<int, Node*> map_tree;
  78.  
  79.     for (int i = 0; i <= n; i++) {
  80.         tree[i] = new Node();
  81.     }
  82.  
  83.     for (int i = 1; i <= n; i++) {
  84. //        tree_ind[i] = tree[i];
  85.         map_tree[i] = tree[i];
  86.         std::cin >> tree[i]->value; // = i;
  87.  
  88.         tree[i]->left_int = ((i*2 <=n) ? i * 2 : 0);
  89.         tree[i]->left = (tree[i]->left_int != 0 ? tree[tree[i]->left_int] : nullptr);
  90.  
  91.         tree[i]->right_int = ((i*2 + 1 <=n) ? i * 2 + 1 : 0);
  92.         tree[i]->right = (tree[i]->right_int != 0 ? tree[tree[i]->right_int] : nullptr);
  93.  
  94.         tree[tree[i]->right_int]->parent = tree[i];
  95.  
  96.         tree[tree[i]->left_int]->parent = tree[i];
  97.     }
  98.  
  99.     int x;
  100.     while (q--) {
  101.         std::cin >> x;
  102.         if (map_tree[x]->parent == nullptr) {
  103.             continue;
  104.         }
  105.         Node* v = map_tree[x];
  106.         Node* p = v->parent;
  107.         if (p->left == v) {
  108.             Node* pr = p->right;
  109.             Node* vr = v->right;
  110.             std::swap(v->value, p->value);
  111.             p->right = vr;
  112.             v->right = pr;
  113.  
  114.             if (vr != nullptr) {
  115.                 vr->parent = p;
  116.             }
  117.  
  118.             if (pr != nullptr) {
  119.                 pr->parent = v;
  120.             }
  121.  
  122.             map_tree[p->value] = p;
  123.             map_tree[v->value] = v;
  124.         } else {
  125.             Node* pl = p->left;
  126.             Node* vl = v->left;
  127.  
  128.             std::swap(p->value, v->value);
  129.             p->left = vl;
  130.             v->left = pl;
  131.  
  132.             if (pl != nullptr) {pl->parent = v;}
  133.  
  134.             if (vl != nullptr) {vl->parent = p;}
  135.  
  136.  
  137.             map_tree[p->value] = p;
  138.             map_tree[v->value] = v;
  139.         }
  140.     }
  141.     std::vector<int> vec;
  142.     print(tree[1], vec);
  143.     delete []tree;
  144.     return vec;
  145. }
  146.  
  147. std::vector<char> solve_char(int file) {
  148. //    std::ifstream in(std::to_string(file));
  149.  
  150.     int n;
  151.     int q;
  152.  
  153. //    std::cin >> n >> q;
  154.  
  155.     std::cin >> n >> q;
  156.  
  157.     Node_char** tree = new Node_char*[n + 1];
  158.     std::unordered_map<int, Node_char*> map_tree;
  159.  
  160.  
  161.  
  162.     for (int i = 0; i <= n; i++) {
  163.         tree[i] = new Node_char();
  164.     }
  165.  
  166.     for (int i = 1; i <= n; i++) {
  167. //        tree_ind[i] = tree[i];
  168.         map_tree[i] = tree[i];
  169.         std::cin >> tree[i]->value; // = i;
  170.  
  171.         tree[i]->left_int = ((i*2 <=n) ? i * 2 : 0);
  172.         tree[i]->left = (tree[i]->left_int != 0 ? tree[tree[i]->left_int] : nullptr);
  173.  
  174.         tree[i]->right_int = ((i*2 + 1 <=n) ? i * 2 + 1 : 0);
  175.         tree[i]->right = (tree[i]->right_int != 0 ? tree[tree[i]->right_int] : nullptr);
  176.  
  177.         tree[tree[i]->right_int]->parent = tree[i];
  178.  
  179.         tree[tree[i]->left_int]->parent = tree[i];
  180.     }
  181.  
  182.     int x;
  183.     while (q--) {
  184.         std::cin >> x;
  185.         if (map_tree[x]->parent == nullptr) {
  186.             continue;
  187.         }
  188.         Node_char* v = map_tree[x];
  189.         Node_char* p = v->parent;
  190.         if (p->left == v) {
  191.             Node_char* pr = p->right;
  192.             Node_char* vr = v->right;
  193.             std::swap(v->value, p->value);
  194.             p->right = vr;
  195.             v->right = pr;
  196.  
  197.             if (vr != nullptr) {
  198.                 vr->parent = p;
  199.             }
  200.  
  201.             if (pr != nullptr) {
  202.                 pr->parent = v;
  203.             }
  204.  
  205.             map_tree[p->value] = p;
  206.             map_tree[v->value] = v;
  207.         } else {
  208.             Node_char* pl = p->left;
  209.             Node_char* vl = v->left;
  210.  
  211.             std::swap(p->value, v->value);
  212.             p->left = vl;
  213.             v->left = pl;
  214.  
  215.             if (pl != nullptr) {pl->parent = v;}
  216.  
  217.             if (vl != nullptr) {vl->parent = p;}
  218.  
  219.  
  220.             map_tree[p->value] = p;
  221.             map_tree[v->value] = v;
  222.         }
  223.     }
  224.     std::vector<char> vec;
  225.     print_char(tree[1], vec);
  226.     delete []tree;
  227.  
  228.     return vec;
  229. }
  230.  
  231.  
  232.  
  233.  
  234. int main() {
  235.     std::ios::sync_with_stdio(false);
  236.     std::cin.tie(nullptr);
  237.  
  238. //    std::freopen(, "r", stdin);
  239.  
  240.     std::vector<int> vec;
  241.     std::vector<char> vec_char;
  242.     for (int i = 30; i < 31; i++) {
  243. //        std::cout << i << "\n";
  244. //        std::ofstream outfile(std::to_string(i) + ".a");
  245. //        std::freopen(std::to_string(i).c_str(), "r", stdin);
  246.  
  247.         vec = solve(i);
  248.         vec_char = solve_char(i);
  249. //        std::fclose(stdin);
  250. //        std::freopen((std::to_string(i) + ".a").c_str(), "w", stdout);
  251.         for (int j = 0; j < vec.size(); j++) {
  252.             while (vec[j]--) {
  253.                 std::cout << vec_char[j];
  254. //                std::printf("%c", vec_char[j]);
  255. //                std::printf(std::string(12, vec_char[j]));
  256.             }
  257.         }
  258. //        std::fclose(stdout);
  259.     }
  260. }
  261.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement