Pagini recente » Cod sursa (job #984123) | Cod sursa (job #753408) | Cod sursa (job #2473161) | Cod sursa (job #2397517) | Cod sursa (job #1414469)
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <algorithm>
using namespace std;
struct Treap
{
int val, ord;
Treap *st, *dr;
Treap()
{
val = ord = 0;
st = dr = 0;
}
Treap(int _val, int _ord, Treap *_st, Treap *_dr)
{
val = _val;
ord = _ord;
st = _st;
dr = _dr;
}
};
Treap *nil = new Treap(0, 0, 0, 0);
Treap *root = nil;
void rotate_lf(Treap *&T)
{
Treap *aux = T->st;
T->st = aux->dr;
aux->dr = T;
T = aux;
}
void rotate_rg(Treap *&T)
{
Treap *aux = T->dr;
T->dr = aux->st;
aux->st = T;
T = aux;
}
void Balance(Treap *&T)
{
if (T->st->ord > T->ord) rotate_lf(T);
if (T->dr->ord > T->ord) rotate_rg(T);
}
void Add(Treap *&T, int val, int ord)
{
if (T == nil)
{
T = new Treap(val, ord, nil, nil);
return;
}
if (val < T->val)
Add(T->st, val, ord);
else
Add(T->dr, val, ord);
Balance(T);
}
void Rem(Treap *&T, int val)
{
if (val < T->val)
Rem(T->st, val);
else if (val > T->val)
Rem(T->dr, val);
else
{
if (T->st == nil && T->dr == nil)
{
delete T;
T = nil;
}
else if (T->st->ord > T->dr->ord)
{
rotate_lf(T);
Rem(T->dr, val);
}
else
{
rotate_rg(T);
Rem(T->st, val);
}
}
}
bool Find(Treap *&T, int val)
{
if (T == nil)
return false;
if (T->val == val)
return true;
if (val < T->val)
return Find(T->st, val);
else
return Find(T->dr, val);
}
int N;
int main()
{
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
srand(time(0));
fin >> N;
for (int i = 1, type; i <= N; ++i)
{
fin >> type;
if (type == 1)
{
int val;
fin >> val;
if (!Find(root, val))
Add(root, val, rand() + 1);
}
else if (type == 2)
{
int val;
fin >> val;
if (Find(root, val))
Rem(root, val);
}
else if (type == 3)
{
int val;
fin >> val;
fout << Find(root, val) << '\n';
}
}
fin.close();
fout.close();
}