Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 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.     while(tree) {
  20.         if(tree->key == key) return true;
  21.         if(tree->key < key) tree = tree->right;
  22.         if(tree->key > key) tree = tree->left;
  23.     }
  24.     return false;
  25. }
  26.  
  27. pair < Node*, Node* > split(Node *tree, int k) {
  28.     if(!tree) return make_pair((Node*)0, (Node*)0);
  29.     if(tree->key <= k) {
  30.         pair < Node*, Node* > p = split(tree->right, k);
  31.         tree->right = p.first;
  32.         return make_pair(tree, p.second);
  33.     } else {
  34.         pair < Node*, Node* > p = split(tree->left, k);
  35.         tree->left = p.second;
  36.         return make_pair(p.first, tree);
  37.     }
  38. }
  39.  
  40. Node* merge(Node* L, Node* R) {
  41.     if(!L) return R;
  42.     if(!R) return L;
  43.     if(L->pr <= R->pr) {
  44.         L->right = merge(L->right, R);
  45.         return L;
  46.     } else {
  47.         R->left = merge(L, R->left);
  48.         return R;
  49.     }
  50. }
  51.  
  52. Node* insert(Node* tree, int k) {
  53.     Node* newnode = new Node(k);
  54.     pair < Node*, Node* > p = split(tree, k);
  55.     return merge(merge(p.first, newnode), p.second);
  56. }
  57.  
  58. void delete_tree(Node* tree) {
  59.     if(!tree) return;
  60.     delete_tree(tree->left);
  61.     delete_tree(tree->right);
  62.     delete(tree);
  63. }
  64.  
  65. Node* erase(Node* tree, int k) {
  66.     pair < Node*, Node* > p = split(tree, k);
  67.     pair < Node*, Node* > p2 = split(tree, k);
  68.     delete_tree(p2.second);
  69.     return merge(p2.first, p.second);
  70. }
  71.  
  72. int main() {
  73.     string s;
  74.     while(cin >> s) {
  75.         int k;
  76.         cin >> k;
  77.         if(s == "insert") {
  78.             insert(root, k);
  79.         }
  80.         if(s == "delete") {
  81.             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