Pagini recente » Cod sursa (job #1650461) | Cod sursa (job #2040310) | Cod sursa (job #1771930) | Istoria paginii runda/oni_2007_ziua1_clasele_xi-xii | Cod sursa (job #1134374)
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <algorithm>
using namespace std;
struct Treap
{
Treap *lf, *rg;
int key, val;
Treap(Treap *_lf, Treap *_rg, int _key, int _val)
{
lf = _lf;
rg = _rg;
key = _key;
val = _val;
}
};
Treap *nil = new Treap(0, 0, 0, 0);
Treap *T = nil;
void rotate_lf(Treap *&T)
{
Treap *aux = T->lf;
T->lf = aux->rg;
aux->rg = T;
T = aux;
}
void rotate_rg(Treap *&T)
{
Treap *aux = T->rg;
T->rg = aux->lf;
aux->lf = T;
T = aux;
}
void balance(Treap *&T)
{
if (T->lf->val > T->val) rotate_lf(T);
if (T->rg->val > T->val) rotate_rg(T);
}
void insert(Treap *&T, int key, int val)
{
if (T == nil)
{
T = new Treap(nil, nil, key, val);
return;
}
if (key == T->key) return;
if (key < T->key) insert(T->lf, key, val);
else insert(T->rg, key, val);
balance(T);
}
void erase(Treap *&T, int key)
{
if (key < T->key)
erase(T->lf, key);
else if (key > T->key)
erase(T->rg, key);
else
{
if (T->lf == nil && T->rg == nil)
{
delete T;
T = nil;
}
else if (T->lf->val > T->rg->val)
{
rotate_lf(T);
erase(T->rg, key);
}
else
{
rotate_rg(T);
erase(T->lf, key);
}
}
}
bool access(Treap *&T, int key)
{
if (T == nil) return false;
if (key == T->key) return true;
if (key < T->key) return access(T->lf, key);
else return access(T->rg, key);
}
int N;
int main()
{
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
fin >> N;
for (int i = 1, type, val; i <= N; ++i)
{
fin >> type >> val;
if (type == 1)
insert(T, val, rand() + 1);
if (type == 2 && access(T, val))
erase(T, val);
if (type == 3)
fout << access(T, val) << '\n';
}
fin.close();
fout.close();
}