Cod sursa(job #344150)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 28 august 2009 18:11:05
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#define N 1<<18
int n,tip,nr;
int heap[N],r;
int pozitii[N],t,val;
void interschimba(int poz1, int poz2)
{
	int temp = heap[poz1];
	heap[poz1] = heap[poz2];
	heap[poz2] = temp;
}
void mut_in_sus(int poz)
{
	if (poz > 1 && heap[poz/2] > heap[poz]) 
	{
		interschimba(poz, poz/2);
		mut_in_sus(poz/2);
	}
}
void mut_in_jos(int poz)
{
	if ((2*poz  <= r && heap[poz] > heap[2*poz] ) ||
		(2*poz+1<= r && heap[poz] > heap[2*poz+1])) 
		{
			int minimum = 2*poz;
			if (2*poz+1 <= r && heap[2*poz+1] < heap[2*poz]) 
				minimum = 2*poz+1;
			interschimba(poz, minimum);
			mut_in_jos(minimum);
		}
}
int gasesc_minim()
{
	return heap[1];
}
int caut()
{
	int i;
	for (i=1; i<=r; i++)
		if (heap[i]==val)
			return i;
	return 0;
}
int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	scanf("%d",&n);
	int i;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&tip);
		if (tip!=3)
			scanf("%d",&nr);
		if (tip==1)
		{
			pozitii[++t]=nr;
			heap[++r]=nr;
			mut_in_sus(r);
		}
		if (tip==2)
		{
			val=pozitii[nr];
			nr=caut();
			heap[nr]=heap[r];
			r--;
			mut_in_jos(nr);
		}
		if (tip==3)
			printf("%d\n",gasesc_minim());
	}
	return 0;
}