Cod sursa(job #395424)

Utilizator otilia_sOtilia Stretcu otilia_s Data 13 februarie 2010 00:17:37
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
using namespace std;
const int NMAX=200006;
int H[NMAX],A[NMAX],poz[NMAX]; 
int lg;

void sift(int x)
{ int fiu;
	do
	{
		fiu=x<<1;
		if (fiu<=lg)
		 {
			if (fiu+1<=lg && A[H[fiu+1]]<A[H[fiu]]) fiu++;
			if (A[H[fiu]]<A[H[x]]) 
			  {
				int aux=poz[H[fiu]]; poz[H[fiu]]=poz[H[x]]; poz[H[x]]=aux;
					aux=H[fiu]; H[fiu]=H[x]; H[x]=aux;
				x=fiu;
			  }
			  else fiu=0;
		 }
		else fiu=0;
	}
	while (fiu);
}

void percolate(int x)
{
	int val=H[x];
	while (x>1 && (A[val]<A[H[(x>>1)]]))
	{
		H[x]=H[x>>1]; poz[H[x]]=x;
		x>>=1;		
	}
	H[x]=val; poz[val]=x;
}

int main()
{
	FILE *fin=fopen("heapuri.in","r");
	FILE *fout=fopen("heapuri.out","w");
	int t,N,x,op,nad;
	fscanf(fin,"%d",&N);
	lg=0; nad=0;
	for (t=1;t<=N;++t)
	{
		fscanf(fin,"%d",&op);
		switch (op)
		{
			case 1:{
					fscanf(fin,"%d",&x);
					H[++lg]=++nad;  A[nad]=x; poz[nad]=lg;
					percolate(lg);
					break;
				   }
			case 2:{
					fscanf(fin,"%d",&x);
					H[poz[x]]=H[lg]; poz[H[lg]]=poz[x]; lg--;
					if (poz[x]>1 && A[H[poz[x]]]<A[H[poz[x]>>1]])  percolate(poz[x]);
						else sift(poz[x]);
					break;
				   }
			case 3:{
					 fprintf(fout,"%d\n",A[H[1]]);
				   }
		}
	}	
	fclose(fin); fclose(fout);
	return 0;
}