Cod sursa(job #634398)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 16 noiembrie 2011 11:08:56
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>

using namespace std;

const int MAX_N = 200005;

int a[MAX_N],heap[MAX_N],p[MAX_N];
int n,lungimeHeap,lungimeA;

void coboaraInHeap(int pozInHeap)
{
	int fiu;
	do
	{
		fiu = 0;
		if(pozInHeap<<1 <= lungimeHeap)
		{
			fiu = pozInHeap<<1;
			if(fiu+1 <= lungimeHeap && a[heap[fiu]] > a[heap[fiu+1]])
				fiu++;
		}
		if(a[heap[pozInHeap]] <= a[heap[fiu]])
			fiu = 0;
		if(fiu)
		{
			int aux=heap[pozInHeap];
			heap[pozInHeap]=heap[fiu];
			heap[fiu] = aux;
			p[heap[pozInHeap]] = pozInHeap;
			p[heap[fiu]] = fiu;
			pozInHeap = fiu;
		}
	}while(fiu);
}

void urcaInHeap(int pozInHeap)
{
	int pozInA = heap[pozInHeap];
	while(pozInHeap>1 && a[pozInA] < a[heap[pozInHeap>>1]])
	{
		heap[pozInHeap] = heap[pozInHeap>>1];
		p[heap[pozInHeap]] = pozInHeap;
		pozInHeap>>=1;
	}
	heap[pozInHeap] = pozInA;
	p[heap[pozInHeap]] = pozInHeap;
}

void inserare(int pozInA)
{
	lungimeHeap++;
	heap[lungimeHeap] = pozInA;
	p[heap[lungimeHeap]] = lungimeHeap;
	urcaInHeap(lungimeHeap);
}

void stergere(int pozInHeap)
{
	heap[pozInHeap] = heap[lungimeHeap];
	p[heap[pozInHeap]] = pozInHeap;
	lungimeHeap--;
	if(pozInHeap>1 && a[heap[pozInHeap]] < a[heap[pozInHeap>>1]])
		urcaInHeap(pozInHeap);
	else 
		coboaraInHeap(pozInHeap);
}

int main()
{
	FILE* fp;
	fp = freopen("heapuri.in","rt",stdin);
	fp = freopen("heapuri.out","wt",stdout);
	
	int abc,instructiune,x;
	lungimeA=0;
	
	abc = scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		abc = scanf("%d",&instructiune);
		if(instructiune == 1)
		{
			abc = scanf("%d",&x);
			a[++lungimeA]=x;
			inserare(lungimeA);			
		}
		else if(instructiune == 2)
		{
			abc = scanf("%d",&x);
			stergere(p[x]);
		}
		else 
		{
			printf("%d\n",a[heap[1]]);
		}
	}
	return 0;
}