Cod sursa(job #1164303)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 1 aprilie 2014 23:32:15
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include<iostream>
#include<fstream>
#include<string.h>
#include<stdlib.h>
#include<time.h>
using namespace std;

#define INF 1<<30

class Treap {
	int info,priority;
	Treap *left,*right;
	
private:
	
	void balance(Treap *&nod);
	
public :
	
	Treap ();
	Treap (int _info, int _priority, Treap *_left, Treap *_right);
	
	void rot_left(Treap *&nod);
	void rot_right(Treap *&nod);
	void insert(Treap *&nod, int _info, int _priority);
	int search(Treap *nod, int _info);
	void erase(Treap *&nod, int _info) ;
};

Treap *nil = new Treap(0,0,NULL,NULL);

Treap :: Treap ()
{
	this->info=0;
	this->priority=0;
	this->left=this->right=nil;
}

Treap :: Treap (int _info, int _priority, Treap *_left, Treap *_right) {
	this->info=_info;
	this->priority=_priority;
	this->left=_left;
	this->right=_right;
}

void Treap :: balance(Treap *&nod) {
	if(nod->left->priority>nod->priority)
		rot_right(nod);
	if(nod->right->priority>nod->priority)
		rot_left(nod);
}

void Treap :: rot_left(Treap *&nod) {
	Treap *aux = nod->right;
	nod->right = aux->left;
	aux->left = nod;
	nod = aux;
}
	
void Treap :: rot_right(Treap *&nod) {
	Treap *aux = nod->left;
	nod->left = aux->right;
	aux->right = nod;
	nod = aux;
}
	
void Treap :: insert(Treap *&nod, int _info, int _priority) {
	if(nod==nil) {
		nod=new Treap(_info,_priority,nil,nil);
		return ;
	}
	if(_info<=nod->info)
		insert(nod->left,_info,_priority);
	else insert(nod->right,_info,_priority);
	balance(nod);
}
	
int Treap :: search(Treap *nod, int _info) {
	if(nod==nil)
		return 0;
	if(nod->info==_info)
		return 1;
	if(_info<=nod->info)
		return search(nod->left,_info);
	else return search(nod->right,_info);
}
	
void Treap :: erase(Treap *&nod, int _info) {
	if(nod==nil)
		return ;
		
	if(_info<nod->info)
		erase(nod->left,_info);
	else if(_info>nod->info)
		erase(nod->right,_info);
	else {
		if(nod->left==nil && nod->right==nil) {
			delete nod;
			nod=nil;
			return ;
		}
		if(nod->left->priority>nod->priority)
			rot_right(nod);
		else rot_left(nod);
		
		erase(nod,_info);
	}
}

Treap *p = new Treap(0,INF,nil,nil);

int main ()
{
	int i,n,op,x;
	ifstream f("hashuri.in");
	ofstream g("hashuri.out");
	f>>n;
	for(i=1;i<=n;i++) {
		f>>op>>x;
		if(op==1) {
			if(p->search(p,x)==0)
				p->insert(p,x,rand()+1);
		}
		else if(op==2) {
			if(p->search(p,x)==1)
				p->erase(p,x);
		}
		else g<<p->search(p,x)<<'\n';
	}
	f.close();
	g.close();
	return 0;
}