Pagini recente » Cod sursa (job #2899526) | Cod sursa (job #2610094) | Cod sursa (job #2476424) | Cod sursa (job #595159) | Cod sursa (job #1968135)
#include <bits/stdc++.h>
using namespace std;
struct Treap {
int key;
long long priority;
Treap *left, *right;
};
Treap* emptyNode = new Treap{0, -1, NULL, NULL};
Treap* CreateNode(int value) {
return new Treap{value, (1LL * rand() * RAND_MAX + rand()), emptyNode, emptyNode};
}
pair<Treap*, Treap*> Split(Treap* A, int value) {
if(A == emptyNode)
return make_pair(emptyNode, emptyNode);
if(A->key <= value) {
auto aux = Split(A->right, value);
A->right = aux.first;
return make_pair(A, aux.second);
} else {
auto aux = Split(A->left, value);
A->left = aux.second;
return make_pair(aux.first, A);
}
}
Treap* Join(Treap* A, Treap* B) {
if(A == emptyNode)
return B;
if(B == emptyNode)
return A;
if(A->priority > B->priority) {
A->right = Join(A->right, B);
return A;
} else {
B->left = Join(A, B->left);
return B;
}
}
Treap* Insert(Treap* node, int value) {
pair<Treap*, Treap*> aux = Split(node, value);
aux.first = Join(aux.first, CreateNode(value));
return Join(aux.first, aux.second);
}
bool Find(Treap* A, int value) {
if(A == emptyNode)
return false;
if(value < A->key)
return Find(A->left, value);
if(value > A->key)
return Find(A->right, value);
return true;
}
Treap* Erase(Treap* node, int value) {
if(node == emptyNode)
return emptyNode;
if(node->key == value)
return Join(node->left, node->right);
if(node->key > value)
node->left = Erase(node->left, value);
else
node->right = Erase(node->right, value);
return node;
}
int main() {
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
srand(time(0));
Treap* root = emptyNode;
int q;
scanf("%d", &q);
while(q--) {
int opType, value;
scanf("%d%d", &opType, &value);
if(opType == 1)
root = Insert(root, value);
else if(opType == 2)
root = Erase(root, value);
else if(Find(root, value))
puts("1");
else
puts("0");
}
}