Pagini recente » Cod sursa (job #1833741) | Teme Pregatire ACM Unibuc 2014, Anul I, Semestrul 2 | Cod sursa (job #3194017) | Profil alexscanteie | Cod sursa (job #1322944)
#include <bits/stdc++.h>
using namespace std;
struct avl
{
int key, h;
avl *l, *r;
} *r, *NIL;
inline int max (int a, int b) {return a > b ? a : b;}
inline void geth (avl *n) { n -> h = max (n -> l -> h, n -> r -> h) + 1;}
void init()
{
r = NIL = new avl;
NIL -> key = NIL -> h = 0;
NIL -> l = NIL -> r = NULL;
}
avl* rotleft(avl *n)
{
avl *t = n -> l;
n -> l = t -> r;
t -> r = n;
geth(n);
geth(t);
return t;
}
avl* rotright(avl *n)
{
avl *t = n -> r;
n -> r = t -> l;
t -> l = n;
geth(n);
geth(t);
return t;
}
avl* balance(avl *n)
{
geth(n);
if (n -> l -> h > n -> r -> h + 1)
{
if (n -> l -> r-> h > n -> l -> l -> h)
n -> l = rotright(n -> l);
n = rotleft(n);
}
else
if (n -> r -> h > n -> l -> h + 1)
{
if (n -> r -> l -> h > n -> r -> r -> h)
n -> r = rotleft(n -> r);
n = rotright(n);
}
return n;
}
avl* insert(avl *n, int key)
{
if (n == NIL)
{
n = new avl;
n -> key = key;
n -> h = 1;
n -> l = n -> r = NIL;
return n;
}
if (key < n -> key)
n -> l = insert(n -> l, key);
else
n -> r = insert(n -> r, key);
return balance(n);
}
avl* erase(avl *n, int key)
{
avl *t;
if (n == NIL) return n;
if (n -> key == key)
{
if (n -> l == NIL || n -> r == NIL)
{
t = n->l == NIL ? n->r : n->l;
delete(n);
return t;
}
else
{
for (t = n -> r; t -> l != NIL; t = t -> l);
n -> key = t -> key,
n -> r = erase(n -> r, t -> key);
return balance(n);
}
}
if (key < n -> key)
n -> l = erase(n -> l, key);
else
n -> r = erase(n -> r, key);
return balance(n);
}
int search(avl *n, int key)
{
// printf ("%d\n", n -> key);
if (n == NIL)
return 0;
if (n -> key == key)
return 1;
if (key < n -> key)
return search(n -> l, key);
else
return search(n -> r, key);
}
int main ()
{
#ifdef INFOARENA
freopen ("hashuri.in", "r", stdin);
freopen ("hashuri.out", "w", stdout);
#endif
init ();
int t, tip, x;
cin >> t;
while (t --)
{
cin >> tip >> x;
avl *y = r;
if (tip == 1)
{
if (!search (y, x))
r = insert (y, x);
}
if (tip == 2)
{
if (search (y, x))
r = erase (y, x);
}
if (tip == 3)
{
cout << search (y, x) << '\n';
}
}
return 0;
}