Cod sursa(job #1254987)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 3 noiembrie 2014 21:40:14
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <time.h>
#include <stdlib.h>

using namespace std;

class Treap {
public:
	struct node {
		int key, priority;
		node *left, *right;
		node(int _key, int _priority, node *_left, node* _right) {
			key = _key;
			priority = _priority;
			left = _left;
			right = _right;
		}
	} *nil, *root;
	Treap() {
		nil = new node(0, 0, NULL, NULL);
		nil->left = nil->right = nil;
		root = nil;
	}
	void Insert(int key, int priority) {
		insert(root, key, priority);
	}
	void Erase(int key) {
		erase(root, key);	
	}
    bool Find(int key) {
		return find(root, key);
	}
private:
	bool find(node *& tr, int key) {
		if(tr == nil)
			return false;
		if(tr->key == key)
			return true;
		if(tr->key < key)
			return find(tr->right, key);
		return find(tr->left, key);
	}
	void rotateLeft(node *&x) {
		node *aux = x->left;
		x->left = aux->right;
		aux->right = x;
		x = aux;
	}
	void rotateRight(node *&y) {
		node *aux = y->right;
		y->right = aux->left;
		aux->left = y;
		y = aux;
	}
	void balance(node *&tr) {
		if(tr->left->priority > tr->priority)
			rotateLeft(tr);
		else
			rotateRight(tr);
	}
	void insert(node *&tr, int key, int priority) {
		if(tr == nil) {
			tr = new node(key, priority, nil, nil);
			return;
		}
		if(tr->key == key)
			return;
		if(key < tr->key)
			insert(tr->left, key, priority);
		else
			insert(tr->right, key, priority);
		balance(tr);
	}
	void erase(node *&tr, int key) {
		if(tr == nil)
			return; // looks likie key wasn't there
		if(tr->key == key) {
			if(tr->left == nil && tr-> right == nil) {
				delete tr;
				tr = nil;
			}
			if(tr->left->priority > tr->right->priority) {
				rotateLeft(tr);
				erase(tr->right, key);
			}
			else {
				rotateRight(tr);
				erase(tr->left, key);
			}
		}
		else {
			if(tr->key > key)
				erase(tr->left, key);
			else
				erase(tr->right, key);
		}
	}
};

int main() {
	ifstream fin("hashuri.in");
	ofstream fout("hashuri.out");
	srand(time(NULL));
	Treap T;
	int M;
	fin >> M;
	while (M --) {
		int op, x;
		fin >> op >> x;
		switch(op) {
			case 1:
				T.Insert(x, rand() + 1);
				break;
			case 2:
				T.Erase(x);
				break;
			case 3:
				fout << T.Find(x) << '\n';
				break;
		}
	}
}