Cod sursa(job #339155)

Utilizator prdianaProdan Diana prdiana Data 8 august 2009 15:20:26
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#define MAXN 400002

int pos[MAXN];
int nri = 0;

struct nod
{
	int key;
	int timp;
};

class Heap
{
public:
	int size;
	nod h[MAXN]; 
	Heap();
	int getMin();
	void deleteNode(int key);
	void heapify(int key);
	void insertElement(int key);
};
Heap::Heap()
{
	size = 0;
}

void swap(nod &x,nod &y)
{
	nod temp = x;
	x = y;
	y = temp;
}

void Heap::heapify(int key)
{
	while ((h[key].key>h[2*key].key || h[key].key>h[2*key+1].key) && 2*key<=size)
	{
		if (2*key+1>size && h[2*key].key<h[key].key)
		{
			pos[h[key].timp] = 2*key;
			pos[h[key*2].timp] = key;
			swap(h[key],h[2*key]);
			key = 2*key;
		}
		else if (2*key+1>size)
		{
			return;
		}
		else if (h[2*key].key<h[2*key+1].key)
		{
			pos[h[key].timp] = 2*key;
			pos[h[key*2].timp] = key;
			swap(h[key],h[2*key]);
			key = 2*key;
		}
		else
		{
			pos[h[key].timp] = 2*key+1;
			pos[h[key*2+1].timp] = key;
			swap(h[key],h[2*key+1]);
			key = 2*key + 1;
		}
	}
}

void Heap::insertElement(int key)
{
	size++;
	nri++;
	h[size].key = key;
	key = size;
	h[size].timp = nri;
	while (h[key/2].key > h[key].key && key>1)
	{
		pos[h[key].timp] = key/2;
		pos[h[key/2].timp] = key;
		swap(h[key/2],h[key]);
		key/=2;
	}
	pos[nri] = key;
}

int Heap::getMin()
{
	return h[1].key;
}

void Heap::deleteNode(int key)
{
	h[pos[key]] = h[size];
	size--;
	heapify(pos[key]);
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	Heap a;
	int i,n,key,op;

	scanf("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf("%d",&op);
		if (op!=3)
		{
			scanf("%d",&key);
		}
		switch (op)
		{
		case 1: a.insertElement(key);break;
		case 2: a.deleteNode(key);break;
		case 3: printf("%d\n",a.getMin());break;
		}
	}
	return 0;
}