Cod sursa(job #268613)

Utilizator coderninuHasna Robert coderninu Data 1 martie 2009 15:37:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstdlib>

#define Nmax 200001

class MinHeap
{
	struct nod { int val, ord; } ;
	private : int nrH, *poz, nr;
	private : nod *h;
	
	private : void swap(int x, int y) { int temp = poz[h[x].ord]; poz[h[x].ord] = poz[h[y].ord]; poz[h[y].ord] = temp; nod tmp = h[x]; h[x] = h[y]; h[y] = tmp; }
	
	private : void heapUp(int loc)
	{
		if (loc == 1) return;
		int tata = loc >> 1;
		if (h[loc].val < h[tata].val) { swap(loc,tata); heapUp(tata); }
	}
	
	private : void heapDown(int loc)
	{
		int fiu = loc << 1;
		if (fiu > nrH) return;
		if (fiu + 1 <=nrH && h[fiu + 1].val < h[fiu].val) ++fiu;
		if (h[loc].val > h[fiu].val) { swap(loc,fiu); heapDown(fiu); }
	}
	
	public : MinHeap(int size)
	{
		poz = (int *)calloc(size, sizeof(int));
		h = (nod *)calloc(size, sizeof(nod));
		nr = nrH = 0;
	}
	
	public : int Min()
	{
		return h[1].val;
	}
	
	public : void Push(int x)
	{
		poz[++nr] = ++nrH;
		h[nrH].val = x; h[nrH].ord = nr;
		heapUp(nrH);
	}
	
	public : void Pop(int loc)
	{
		loc = poz[loc];
		swap(loc,nrH--);
		heapDown(loc);
	}
} ;

int N, a, b;
MinHeap heap(Nmax);

int main()
{
	freopen("heapuri.in", "r", stdin);
	freopen("heapuri.out", "w", stdout);
	for ( scanf("%d\n", &N); N; --N)
	{
		scanf ("%d ", &a);
		if (a < 3) scanf("%d\n", &b);
		switch(a)
		{
			case 1 : heap.Push(b); break;
			case 2 : heap.Pop(b); break;
			case 3 : printf("%d\n", heap.Min());
		}
	}
	return 0;
}