Advertisement
CyberN00b

Untitled

Dec 4th, 2022
634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define LINT long long int
  3.  
  4. using namespace std;
  5.  
  6.  
  7. struct ListNode {
  8.     int val;
  9.     ListNode *left;
  10.     ListNode *right;
  11.     ListNode *pred;
  12.     ListNode() : val(0), left(nullptr), right(nullptr), pred(nullptr){}
  13.     ListNode(int x) : val(x), left(nullptr), right(nullptr), pred(nullptr) {}
  14.     ListNode(int x, ListNode *left, ListNode *right, ListNode *pred) : val(x), left(left), right(right), pred(pred){}
  15. };
  16.  
  17. vector<ListNode*> vc;
  18. void create_node(ListNode* head, int index, int s) {
  19.     vc[index] = head;
  20.     if (index * 2 <= s) {
  21.         ListNode* left = new ListNode(index * 2, nullptr, nullptr, head);
  22.         head->left = left;
  23.         create_node(left, index * 2, s);
  24.     }
  25.     if (index * 2 + 1 <= s) {
  26.         ListNode* right = new ListNode(index * 2 + 1, nullptr, nullptr, head);
  27.         head->right = right;
  28.         create_node(right, index * 2 + 1, s);
  29.     }
  30. }
  31. ListNode* create_tree(int s) {
  32.     if (s == 0)
  33.         return nullptr;
  34.     ListNode* root = new ListNode(1);
  35.     create_node(root, 1, s);
  36.     return root;
  37. }
  38.  
  39. void print_node(ListNode* head) {
  40.     if (head->left != nullptr)
  41.         print_node(head->left);
  42.     cout << head->val << ' ';
  43.     if (head->right != nullptr)
  44.         print_node(head->right);
  45. }
  46. int main()
  47. {
  48.     int a;
  49.     cin >> a;
  50.     vc.resize(a + 1);
  51.     ListNode* root = create_tree(a);
  52.     int b;
  53.     cin >> b;
  54.     for (int i = 0; i < b; ++i) {
  55.         int t;
  56.         cin >> t;
  57.         ListNode* v = vc[t];
  58.         if (v->pred == nullptr)
  59.             continue;
  60.         ListNode* p = v->pred;
  61.         if (p == root)
  62.             root = v;
  63.         v->pred = p->pred;
  64.         if (p->pred != nullptr) {
  65.             if (p->pred->right == p)
  66.                 p->pred->right = v;
  67.             else
  68.                 p->pred->left = v;
  69.         }
  70.         p->pred = v;
  71.         if (p->right == v) { // its right
  72.             p->right = v->right;
  73.             if (p->right != nullptr)
  74.                 p->right->pred = p;
  75.             v->right = p;
  76.             if (v->right != nullptr)
  77.                 v->right->pred = v;
  78.         } else {
  79.             p->left = v->left;
  80.             if (p->left != nullptr)
  81.                 p->left->pred = p;
  82.             v->left = p;
  83.             if (v->left != nullptr)
  84.                 v->left->pred = v;
  85.         }
  86.     }
  87.     print_node(root);
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement