Cod sursa(job #587569)

Utilizator AnteusPatrascoiu Mihai Anteus Data 5 mai 2011 10:28:55
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#include <fstream.h>
#define N 200001
ifstream fin("heapuri.in");
FILE *g=fopen ("heapuri.out", "w");
int v[N],H[N],P[N],n,m,nr,i,sw,x;

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

void insert (int x) {

while (x>1 && v[H[x]]<v[H[x/2]])
{
	swap(H[x], H[x/2]);
	
	P[H[x]]=x;
	P[H[x/2]]=x/2;
	x/=2;
}
}

void pop (int x) {
int fiu;
do
{
	fiu=0;
	if (2*x <=m)							fiu=2*x;
	if (2*x+1<=m && v[H[fiu]]>v[H[2*x+1]])	fiu=2*x+1;
	if (v[H[fiu]]>v[H[x]])					fiu=0;
	
	if (fiu)
	{
		swap (H[fiu], H[x]);
		P[H[fiu]]=fiu;
		P[H[x]]=x;
		x=fiu;
	}
}
while (fiu);
}

int main() {
fin>>n;
for (i=1;i<=n;i++)
{
	fin>>sw;
	if (sw==1)
	{
		fin>>v[++nr];
		H[++m]=nr;
		P[nr]=m;
		
		insert(m);
	}
	if (sw==2)
	{
		fin>>x;
		v[x]=-1;
		
		insert(P[x]);
		P[H[1]]=0;
		
		H[1]=H[m--];
		pop(1);
	}
	if (sw==3)
		fprintf (g, "%d\n", v[H[1]]);
}

return 0;
}