Cod sursa(job #1322944)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 20 ianuarie 2015 15:43:16
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#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;
}