Cod sursa(job #947770)
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <algorithm>
using namespace std;
struct Treap
{
int key, val;
Treap *left, *right;
Treap()
{
}
Treap(int _key, int _val, Treap* _left, Treap* _right)
{
key = _key;
val = _val;
left = _left;
right = _right;
}
};
Treap *R, *nil;
void rotate_left(Treap* &T)
{
Treap* aux = T->left;
T->left = aux->right;
aux->right = T;
T = aux;
}
void rotate_right(Treap* &T)
{
Treap* aux = T->right;
T->right = aux->left;
aux->left = T;
T = aux;
}
void balance(Treap* &T)
{
if (T->val < T->left->val)
rotate_left(T);
if (T->val < T->right->val)
rotate_right(T);
}
void insert(Treap* &T, int key, int val)
{
if (T == nil)
{
T = new Treap(key, val, nil, nil);
return;
}
if (key == T->key) return;
if (key < T->key) insert(T->left, key, val);
else insert(T->right, key, val);
balance(T);
}
void erase(Treap* &T, int key)
{
if (T == nil) return;
if (key < T->key) erase(T->left, key);
else if (key > T->key) erase(T->right, key);
else
{
if (T->left == nil && T->right == nil)
{
delete T;
T = nil;
return;
}
if (T->left->val > T->right->val)
{
rotate_left(T);
erase(T->right, key);
}
else
{
rotate_right(T);
erase(T->left, key);
}
}
}
bool access(Treap* T, int key)
{
if (T == nil) return false;
if (key == T->key) return true;
else if (key < T->key) return access(T->left, key);
else if (key > T->key) return access(T->right, key);
return false;
}
int N;
int main()
{
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
srand(time(0));
R = nil = new Treap(0, 0, 0, 0);
fin >> N;
for (int i = 1, type, val; i <= N; ++i)
{
fin >> type >> val;
if (type == 1)
insert(R, val, rand() + 1);
else if (type == 2)
erase(R, val);
else if (type == 3)
fout << access(R, val) << '\n';
}
fin.close();
fout.close();
}