Cod sursa(job #1414469)

Utilizator darrenRares Buhai darren Data 2 aprilie 2015 17:14:03
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#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();
}