Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3.  
  4. using namespace std;
  5.  
  6. long long getRand() {
  7.     return (rand() << 15) + rand();
  8. }
  9.  
  10. struct Node {
  11.     long long key, pr;
  12.     Node *left, *right;
  13.     Node(int k) : key(k), pr(getRand()), left(NULL), right(NULL) {}
  14. };
  15.  
  16. Node *root;
  17.  
  18. bool search(Node *tree, int key) {
  19.     if (!tree) return false;
  20.     if (tree->key == key) return true;
  21.     if (tree->key < key) return search(tree->right, key);
  22.     return search(tree->left, key);
  23. }
  24.  
  25. pair < Node*, Node* > split(Node *tree, int k) {
  26.     if(!tree) return make_pair((Node*)0, (Node*)0);
  27.     if(tree->key <= k) {
  28.         pair < Node*, Node* > p = split(tree->right, k);
  29.         tree->right = p.first;
  30.         return make_pair(tree, p.second);
  31.     } else {
  32.         pair < Node*, Node* > p = split(tree->left, k);
  33.         tree->left = p.second;
  34.         return make_pair(p.first, tree);
  35.     }
  36. }
  37.  
  38. Node* merge(Node* L, Node* R) {
  39.     if(!L) return R;
  40.     if(!R) return L;
  41.     if(L->pr <= R->pr) {
  42.         L->right = merge(L->right, R);
  43.         return L;
  44.     } else {
  45.         R->left = merge(L, R->left);
  46.         return R;
  47.     }
  48. }
  49.  
  50. Node* insert(Node* tree, int k) {
  51.     Node* newnode = new Node(k);
  52.     pair < Node*, Node* > p = split(tree, k);
  53.     return merge(merge(p.first, newnode), p.second);
  54. }
  55.  
  56. void delete_tree(Node* tree) {
  57.     if(!tree) return;
  58.     delete_tree(tree->left);
  59.     delete_tree(tree->right);
  60.     delete(tree);
  61. }
  62.  
  63. Node* erase(Node* tree, int k) {
  64.     pair < Node*, Node* > p = split(tree, k);
  65.     pair < Node*, Node* > p2 = split(tree, k);
  66.     delete_tree(p2.second);
  67.     return merge(p2.first, p.second);
  68. }
  69.  
  70. int main() {
  71.     ios_base::sync_with_stdio(0);
  72.     cin.tie(0); cout.tie(0);
  73.     string s;
  74.     while(cin >> s) {
  75.         int k;
  76.         cin >> k;
  77.         if(s == "insert") {
  78.             root = insert(root, k);
  79.         }
  80.         if(s == "delete") {
  81.             root = erase(root, k);
  82.         }
  83.         if(s == "exists") {
  84.             bool f = search(root, k);
  85.             if(f) cout << "true" << endl;
  86.             else cout << "false" << endl;
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement