Pagini recente » Cod sursa (job #929008) | Cod sursa (job #2875011) | Cod sursa (job #467257) | Cod sursa (job #1819391) | Cod sursa (job #1537184)
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int key;
int priority;
Node *st, *dr;
Node(int k, int p, Node *l, Node *r)
{
this->key = k;
this->priority = p;
this->st = l;
this->dr = r;
}
};
Node *ROOT, *NIL;
void initTreap()
{
srand(time(nullptr));
NIL = new Node(0, 0, nullptr, nullptr);
ROOT = NIL;
}
void rotateToLeft(Node *&T)
{
Node *tmp = T->dr;
T->dr = tmp->st;
tmp->st = T;
T = tmp;
}
void rotateToRight(Node *&T)
{
Node *tmp = T->st;
T->st = tmp->dr;
tmp->dr = T;
T = tmp;
}
void balance(Node *&T)
{
if (T->st->priority > T->priority)
rotateToRight(T);
else if (T->dr->priority > T->priority)
rotateToLeft(T);
}
void insert(Node *&T, int key, int priority = rand() % 1)
{
if (T == NIL)
T = new Node(key, priority, NIL, NIL);
else
{
if (key < T->key)
insert(T->st, key, priority);
else if (key > T->key)
insert(T->dr, key, priority);
balance(T);
}
}
bool find(Node *&T, int key)
{
if (T == NIL)
return false;
if (T->key == key)
return true;
if (key < T->key)
return find(T->st, key);
else
return find(T->dr, key);
}
void erase(Node *&T, int key)
{
if (T == NIL)
return;
if (T->key == key)
{
if (T->st == NIL && T->dr == NIL)
{
delete T;
T = NIL;
}
else
{
if (T->st->priority > T->dr->priority)
{
rotateToRight(T);
erase(T->dr, key);
}
else
{
rotateToLeft(T);
erase(T->st, key);
}
}
}
else
{
if (key < T->key)
erase(T->st, key);
else
erase(T->dr, key);
}
}
int main()
{
ifstream in("hashuri.in");
ofstream out("hashuri.out");
int N, X, tip;
in >> N;
initTreap();
while (N--)
{
in >> tip >> X;
if (tip == 1)
insert(ROOT, X);
else if (tip == 2)
erase(ROOT, X);
else
out << find(ROOT, X) << "\n";
}
return 0;
}