Pagini recente » Cod sursa (job #2280090) | Cod sursa (job #1556379) | Cod sursa (job #1727047) | Cod sursa (job #2645129) | Cod sursa (job #1182469)
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <algorithm>
using namespace std;
struct Treap
{
int key, val;
Treap *lf, *rg;
Treap(int _key, int _val, Treap *_lf, Treap *_rg)
{
key = _key;
val = _val;
lf = _lf;
rg = _rg;
}
};
Treap *nil = new Treap(0, 0, 0, 0);
Treap *root = nil;
void rot_left(Treap *&nod)
{
Treap *aux = nod->lf;
nod->lf = aux->rg;
aux->rg = nod;
nod = aux;
}
void rot_right(Treap *&nod)
{
Treap *aux = nod->rg;
nod->rg = aux->lf;
aux->lf = nod;
nod = aux;
}
void balance(Treap *&nod)
{
if (nod->lf->val > nod->val) rot_left(nod);
if (nod->rg->val > nod->val) rot_right(nod);
}
void insert(Treap *&nod, int key, int val)
{
if (nod == nil)
{
nod = new Treap(key, val, nil, nil);
return;
}
if (key < nod->key) insert(nod->lf, key, val);
else insert(nod->rg, key, val);
balance(nod);
}
void erase(Treap *&nod, int key)
{
if (key < nod->key) erase(nod->lf, key);
else if (key > nod->key) erase(nod->rg, key);
else
{
if (nod->lf == nil && nod->rg == nil)
{
delete nod;
nod = nil;
return;
}
else if (nod->lf->val > nod->rg->val)
{
rot_left(nod);
erase(nod->rg, key);
}
else
{
rot_right(nod);
erase(nod->lf, key);
}
}
balance(nod);
}
bool findt(Treap *&nod, int key)
{
if (nod == nil) return false;
if (key < nod->key) return findt(nod->lf, key);
else if (key > nod->key) return findt(nod->rg, key);
else return true;
}
int N;
int main()
{
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
fin >> N;
for (int i = 1, type; i <= N; ++i)
{
fin >> type;
if (type == 1)
{
int key;
fin >> key;
if (!findt(root, key))
insert(root, key, rand() + 1);
}
else if (type == 2)
{
int key;
fin >> key;
if (findt(root, key))
erase(root, key);
}
else
{
int key;
fin >> key;
fout << findt(root, key) << '\n';
}
}
fin.close();
fout.close();
}