Pagini recente » Cod sursa (job #2023532) | Cod sursa (job #2248625) | Cod sursa (job #1728441) | Monitorul de evaluare | Cod sursa (job #2004473)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
class Treap{
public:
Treap *left, *right;
int info, priority;
Treap() {
left = right = 0;
info = priority = 0;
}
Treap(Treap *l, Treap *r, int inf, int prio) {
left = l;
right = r;
info = inf;
priority = prio;
}
};
Treap *Nil, *root;
void init()
{
srand(time(0));
Nil = new Treap();
Nil->left = Nil->right = Nil;
Nil->priority = -INF; Nil->info = 0;
root = new Treap(Nil, Nil, 0, INT_MAX);
}
void rotateRight(Treap *&root)
{
Treap *aux = root->left;
root->left = aux->right;
aux->right = root;
root = aux;
}
void rotateLeft(Treap *&root)
{
Treap *aux = root->right;
root->right = aux->left;
aux->left = root;
root = aux;
}
void balance(Treap *&root)
{
if(root->left->priority > root->priority)
rotateRight(root);
else
if(root->right->priority > root->priority)
rotateLeft(root);
}
void insert(Treap *&root, int k)
{
if(root == Nil) {
root = new Treap(Nil, Nil, k, rand());
return;
}
if(k <= root->info)
insert(root->left, k);
else
insert(root->right, k);
balance(root);
}
void del(Treap *&root, int k)
{
if(k == root->info) {
if(root->left != Nil && root->right != Nil) {
if(root->left->priority > root->right->priority) {
rotateRight(root);
del(root->right, k);
}
else {
rotateLeft(root);
del(root->left ,k);
}
return;
}
if(root->left != Nil) {
Treap *aux = root;
root = root->left;
delete aux;
return;
}
if(root->right != Nil) {
Treap *aux = root;
root = root->right;
delete aux;
return;
}
Treap *aux = root;
root = Nil;
delete aux;
return;
}
if(k < root->info) {
del(root->left, k);
}
else if(k > root->info) {
del(root->right, k);
}
}
Treap* join(Treap *&left, Treap *&right)
{
if(left == Nil)
return right;
if(right == Nil)
return left;
if(left->priority > right->priority) {
left->right = join(left->right, right);
return left;
}
right->left = join(left, right->left);
return right;
}
void delet(Treap *&root, int k) {
if(root->info == k) {
root = join(root->left, root->right);
return;
}
if(k < root->info)
delet(root->left, k);
else
delet(root->right, k);
}
bool search(Treap *root, int k) {
if(root == Nil)
return false;
if(root->info == k)
return true;
if(k < root->info)
return search(root->left, k);
return search(root->right, k);
}
int main()
{
init();
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
int N;
scanf("%d", &N);
for(int i = 1; i <= N; ++i) {
int tip, val;
scanf("%d %d", &tip, &val);
if(tip == 1){
if(!search(root->left, val)) {
insert(root->left, val);
}
continue;
}
if(tip == 2) {
if(search(root->left, val)) {
delet(root->left, val);
}
continue;
}
printf("%d\n", search(root->left, val));
}
return 0;
}