Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<string>
- using namespace std;
- struct Node {
- Node *l, *r;
- long long key, pr;
- Node(int x) : key(x), pr(rand()), l(nullptr), r(nullptr) {}
- };
- Node* merge(Node* L, Node* R) {
- if (L == nullptr) return R;
- if (R == nullptr) return L;
- if (L->pr > R->pr) {
- L->r = merge(L->r, R);
- return L;
- }
- R->l = merge(L, R->l);
- return R;
- }
- pair < Node*, Node* > split(Node* tree, int k) {
- if (tree == nullptr) return {nullptr, nullptr};
- if (tree->key <= k) {
- pair < Node*, Node* > p = split(tree->r, k);
- tree->r = p.first;
- return {tree, p.second};
- }
- auto p = split(tree->l, k);
- tree->l = p.second;
- return {p.first, tree};
- }
- Node* insert(Node* tree, int k) {
- auto p = split(tree, k);
- Node* v = new Node(k);
- return merge(merge(p.first, v), p.second);
- }
- Node* erase(Node* tree, int k) {
- if (tree == nullptr) return tree;
- if (tree->key == k) return merge(tree->l, tree->r);
- if (tree->key < k) {
- tree->r = erase(tree->r, k);
- } else {
- tree->l = erase(tree->l, k);
- }
- return tree;
- }
- bool search(Node* tree, int k) {
- if (tree == nullptr) return false;
- if (tree->key == k) return true;
- if (tree->key < k) return search(tree->r, k);
- return search(tree->l, k);
- }
- int main() {
- Node *root = nullptr;
- string s;
- long long k;
- while (cin >> s) {
- cin >> k;
- if (s == "insert") {
- bool f = search(root, k);
- if (!f) root = insert(root, k);
- } else if (s == "delete") {
- bool f = search(root, k);
- if (f) root = erase(root, k);
- } else {
- bool f = search(root, k);
- if(f) cout << "true" << endl;
- else cout << "false" << endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement