Advertisement
johndolgov

Untitled

Dec 9th, 2018
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.33 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct Node{
  4.     int key;
  5.     Node* left = nullptr;
  6.     Node* right = nullptr;
  7.     Node* parent = nullptr;
  8.     Node(int k, Node* l = nullptr, Node* r = nullptr, Node* p = nullptr){
  9.         key = k;
  10.         left = l;
  11.         right = r;
  12.         parent = p;
  13.     }
  14. };
  15. void set_parent(Node * child, Node* parent){
  16.     if (child != nullptr){
  17.         child->parent = parent;
  18.     }
  19. }
  20.  
  21. void keep_parent(Node* parent){
  22.     set_parent(parent->left, parent);
  23.     set_parent(parent->right, parent);
  24. }
  25.  
  26. void rotate(Node* parent, Node* child){
  27.     Node* grantpar = child->parent->parent;
  28.     if(grantpar != nullptr){
  29.         if(grantpar->left == parent){
  30.             grantpar->left = child;
  31.         }else{
  32.             grantpar->right = child;
  33.         }
  34.         }
  35.     if(parent->left == child){
  36.         parent->left = child->right;
  37.         child->right = parent;
  38.     }else{
  39.         parent->right = child->left;
  40.         child->left = parent;
  41.     }
  42.     keep_parent(parent);
  43.     keep_parent(child);
  44.     child->parent = grantpar;
  45. }
  46.  
  47. Node* splay(Node* node){
  48.     if(node->parent == nullptr){
  49.         return node;
  50.     }
  51.     Node* parent = node->parent;
  52.     Node* grant_parent = node->parent->parent;
  53.     if (grant_parent == nullptr){
  54.         rotate(parent, node);
  55.         return node;
  56.     }
  57.     else{
  58.         if((grant_parent->left == parent) == (parent->left == node)){
  59.             rotate(grant_parent, parent);
  60.             rotate(parent,node);
  61.         }else{
  62.             rotate(parent, node);
  63.             rotate(grant_parent, node);
  64.         }
  65.         return splay(node);
  66.     }
  67. }
  68.  
  69. Node* find(Node* node, int key){
  70.     if(node == nullptr){
  71.         return node;
  72.     }
  73.     else if(node->key > key){
  74.         if(node->right == nullptr){
  75.             splay(node);
  76.         }else{
  77.             return find(node->right, key);
  78.         }
  79.     }
  80.     else if(node->key < key){
  81.         if(node->left == nullptr){
  82.             splay(node);
  83.         }else{
  84.             return find(node->left, key);
  85.         }
  86.     }
  87.     return splay(node);
  88. }
  89.  
  90. Node* subtree_max(Node* node){
  91.     if(node->right != nullptr){
  92.         return subtree_max(node->right);
  93.     }else{
  94.         splay(node);
  95.     }
  96. }
  97.  
  98. Node* subtree_min(Node* node){
  99.     if(node->left != nullptr){
  100.         return subtree_min(node);
  101.     }else{
  102.         splay(node);
  103.     }
  104. }
  105.  
  106. Node* merge(Node* left, Node* right){
  107.     if(right == nullptr){
  108.         return left;
  109.     }
  110.     if(left == nullptr){
  111.         return right;
  112.     }
  113.     right = find(right, left->key);
  114.     right->left = left;
  115.     left->parent = right;
  116.     return right;
  117. }
  118.  
  119. std::pair<Node*, Node*>split(Node* root, int key){
  120.     if(root == nullptr){
  121.         return std::make_pair(nullptr, nullptr);
  122.     }
  123.     root = find(root, key);
  124.     if(root->key <= key){
  125.         if (root->right != nullptr){
  126.             root->right->parent = nullptr;
  127.             root->right = nullptr;
  128.             return std::make_pair(root, root->right);
  129.         }
  130.         else{
  131.             return std::make_pair(root, nullptr);
  132.         }
  133.     }
  134.     else{
  135.         if(root->left != nullptr){
  136.             root->left->parent = nullptr;
  137.             root->left = nullptr;
  138.             return std::make_pair(root, root->left);
  139.         }
  140.         else{
  141.             return std::make_pair(root, nullptr);
  142.         }
  143.     }
  144. }
  145.  
  146. Node* insert(Node* node, int key){
  147.     std::pair<Node*, Node*> subtrees = split(node,key);
  148.     Node* left_node = subtrees.first;
  149.     Node* right_node = subtrees.second;
  150.     if((left_node!= nullptr)&&(left_node->key == key)){
  151.         left_node->right = right_node;
  152.         keep_parent(left_node);
  153.         return left_node;
  154.     }
  155.     if((right_node != nullptr)&&(right_node->key == key)){
  156.         right_node->left = left_node;
  157.         keep_parent(right_node);
  158.         return right_node;
  159.     }
  160.     Node* newnode = new Node(key, left_node, right_node);
  161.     keep_parent(newnode);
  162.     return newnode;
  163. }
  164.  
  165. Node* remove(Node* node, int key){
  166.     node = find(node, key);
  167.     if((node != nullptr) && (node->key == key)){
  168.         if(node->left != nullptr){
  169.             node->left->parent = nullptr;
  170.         }
  171.         if(node->right != nullptr){
  172.             node->right->parent = nullptr;
  173.         }
  174.         node = merge(node->left, node->right);
  175.     }
  176.     return node;
  177. }
  178.  
  179. Node* prev_el(Node* root, int key){
  180.     root = find(root, key);
  181.     if(root != nullptr){
  182.         if(root->key < key){
  183.             return root;
  184.         }else if(root->left != nullptr){
  185.             root = subtree_max(root->left);
  186.             return root;
  187.         }
  188.     }else{
  189.         return nullptr;
  190.     }
  191.  
  192. }
  193.  
  194. Node* next_el(Node* root, int key){
  195.     root = find(root, key);
  196.     if(root != nullptr){
  197.         if(root->key > key){
  198.             return root;
  199.         }else if(root->right != nullptr){
  200.             root = subtree_min(root->right);
  201.             return root;
  202.         }
  203.     }else{
  204.         return nullptr;
  205.     }
  206.  
  207. }
  208.  
  209. int main() {
  210.     Node* root = nullptr;
  211.     while(std::cin){
  212.         std::string command = " ";
  213.         std::cin >> command;
  214.         if(command == "insert"){
  215.             int key = 0;
  216.             std::cin >> key;
  217.             root = insert(root, key);
  218.             std::cout << root->key;
  219.         }
  220.         if(command == "delete"){
  221.             int key = 0;
  222.             std::cin >> key;
  223.             root = remove(root, key);
  224.         }
  225.         if(command == "exists"){
  226.             int key = 0;
  227.             std::cin >> key;
  228.             root = find(root, key);
  229.             if(root != nullptr && root->key == key){
  230.                 std::cout << "true" <<'\n';
  231.             }else{
  232.                 std::cout << "false" <<"\n";
  233.             }
  234.         }
  235.         if(command == "next"){
  236.             int key = 0;
  237.             std::cin >> key;
  238.             root = next_el(root, key);
  239.             if(root != nullptr && root->key == key){
  240.                 std::cout << root->key <<'\n';
  241.             }else{
  242.                 std::cout << "none" <<"\n";
  243.             }
  244.         }
  245.         if(command == "prev"){
  246.             int key = 0;
  247.             std::cin >> key;
  248.             root = prev_el(root, key);
  249.             if(root != nullptr && root->key == key){
  250.                 std::cout << root->key <<'\n';
  251.             }else{
  252.                 std::cout << "none" <<"\n";
  253.             }
  254.  
  255.         }
  256.     }
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement