Cod sursa(job #1071831)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 3 ianuarie 2014 15:57:25
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;

struct item {
	int key, priority;
	item *left, *right;
	item() { };
	item(int key, int priority, item *left, item *right) {
		this -> key = key;
		this -> priority = priority;
		this -> left = left, this -> right = right;
	}
};
typedef item * pitem;

pitem R, nil;

void init()
{
	srand(time(0));
	R = nil = new item(0, 0, NULL, NULL);
}

int search(pitem n, int key)
{
	if (n == nil)
		return 0;
	if (key == n -> key)
		return 1;
	if (key <= n -> key)
		return search(n -> left, key);
	return search(n -> right, key);
}

void rotleft(pitem &n)
{
	pitem t = n -> left;
	n -> left = t -> right;
	t -> right = n;
	n = t;
}

void rotright(pitem &n)
{
	pitem t = n -> right;
	n -> right = t -> left;
	t -> left = n;
	n = t;
}

void balance(pitem &n)
{
	if (n -> left -> priority > n -> priority)
		rotleft(n);
	else
		if (n -> right -> priority > n -> priority)
			rotright(n);
}

void insert(pitem &n, int key, int priority)
{
	if (n == nil)
	{
		n = new item(key, priority, nil, nil);
		return ;
	}
	if (key <= n -> key)
		insert(n -> left, key, priority);
	else
		insert(n -> right, key, priority);
	
	balance(n);
}

void erase(pitem &n, int key)
{
	if (n == nil)
		return ;
	
	if (key < n -> key)
		erase(n -> left, key);
	else
		if (key > n -> key)
			erase(n -> right, key);
		else
		{
			if (n -> left == nil && n -> right == nil)
			{
				delete n;
				n = nil;
			}
			else
			{
				(n -> left -> priority > n -> right -> priority) ? rotleft(n) : rotright(n);
				erase(n, key);
			}
		}
}

int getMin(pitem &n)
{
	if (n -> left != nil)
		return getMin(n -> left);
	return n -> key;
}

#define NMAX 200005
int n, A[NMAX], r;

int main()
{
	//~ freopen("input", "r", stdin);
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	
	init();
	scanf("%d", &n);
	int type, x;
	while (n--)
	{
		scanf("%d", &type);
		switch (type)
		{
			case 1: scanf("%d", &x);
					insert(R, x, rand() + 1);
					A[++r] = x;
					break ;
			case 2: scanf("%d", &x);
					erase(R, A[x]);
					break ;
			case 3: printf("%d\n", getMin(R));
					break ;
		}
	}
	return 0;
}