Cod sursa(job #709914)

Utilizator gabriel93Robu Gabriel gabriel93 Data 8 martie 2012 18:14:35
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
using namespace std;
int heap[1000],poz[1000];

int tata(int nod)
{
	return nod/2;
}

int fs(int nod)//fiu din stanga
{
	return nod*2;
}

int fd(int nod)//fiu din dreapta
{
	return nod*2+1;
}

void swap(int &a,int &b)
{
	int aux;
	aux=a;
	a=b;
	b=aux;
}

void sift(int n,int k)//mutam un nod ma jos daca este mai mare decat unul din fii sai
{
	int x;
	do
	{
		x=0;
		if(fs(k) <= n)
		{
			x=fs(k);
			if(fd(k) <=n && heap[fd(k)] < heap[x])
				x=fd(k);
			if(heap[x] > heap[k])
				x=0;
		}
		if(x)
		{
			swap(heap[x],heap[k]);
			swap(poz[x],poz[k]);
			k=x;
		}
	
	}while(x);
}

void perc(int n,int k)//mutam un nod mai sus daca este mai mic decat tatal sau
{
	int x;
	x=heap[k];
	while(k > 1 && x < heap[tata(k)])
	{
		heap[k]=heap[tata(k)];
		swap(poz[k],poz[tata(k)]);
		k=tata(k);
	}
	heap[k]=x;
}

void adaug(int &n,int k,int p)
{
	n++;
	poz[n]=p;
	heap[n]=k;
	perc(n,n);
}

void sterg(int &n,int k)
{
	heap[k]=heap[n];
	swap(poz[k],poz[n]);
	n--;
	if(k>1 && heap[k] < heap[tata(k)])
		perc(n,k);
	else
		sift(n,k);
}

void rezolv()
{
	int i,n,k,x,p,cod;
	scanf("%d",&k);
	n=0; p=0;
	for(i=1;i<=k;i++)
	{
		scanf("%d",&cod);
		if(cod==3)
		{
			printf("%d\n",heap[1]);
			sterg(n,1);
		}
		else
		{
			scanf("%d",&x);
			if(cod==1)
			{
				p++;
				adaug(n,x,p);
			}
			else
				sterg(n,poz[x]);
		}
	}
}

int main()
{
	freopen("heapuri.in","r",stdin);
	//freopen("heapuri.out","w",stdout);
	rezolv();
	fclose(stdin);
	fclose(stdout);
	return 0;
}