Cod sursa(job #652637)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 25 decembrie 2011 16:26:00
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<cstdio>
using namespace std;
long heap[200003],n,nr,aux,i,m,poz[200003],c[200003],q,m1;//poz retine pozitia fiecarui elemen pt a il elimina mai repede
long op;
void reheap(int k)
{
	while( (heap[k/2]>heap[k] || heap[k/2]==-1 )&& k/2)//cat timp tatal este mai mare decat fiul interschimb fiul cu tatal
	{
		poz[heap[k/2]]=poz[heap[k]];
		
		aux=heap[k/2];
		heap[k/2]=heap[k];
		heap[k]=aux;
		
		k/=2;
		poz[nr]=k;
	}
}
void insereaza(long nr)//insereaza pe nr in heap
{ n++;
	if(heap[1]==0){ heap[1]=nr; poz[nr]=1; return; }
	else
	{
		heap[n]=nr;
		poz[nr]=n;
		reheap(n);
	}
}
void elimina(long nr)//elimina pe nr din heap
{int k=poz[nr];//pozitia in heap a numarului
   while(heap[2*k]||heap[2*k+1])
   {
	if(heap[2*k]<heap[2*k+1] || heap[2*k+1]==0)//verifica minimul dintre fii pt a ramane heap
	{
		aux=poz[heap[k]];
		poz[heap[k]]=poz[heap[2*k]];
		poz[heap[2*k]]=aux;
		
		aux=heap[k];
		heap[k]=heap[2*k];
		heap[2*k]=aux;
		
		k=poz[nr];
	}
	else
	{
		aux=poz[heap[k]];
		poz[heap[k]]=poz[heap[2*k]];
		poz[heap[2*k]]=aux;
		
		aux=heap[k];
		heap[k]=heap[2*k+1];
		heap[2*k+1]=aux;
		
		k=poz[nr];
	}
   }
	heap[poz[nr]]=-1;
}
int main()
{
	freopen("heapuri.in","r",stdin);freopen("heapuri.out","w",stdout);
	scanf("%ld",&m);m1=m;
	for(i=1;i<=m1;i++)
	{
		scanf("%ld",&op);
		if(op==3)printf("%ld\n",heap[1]);//afiseaza varful heapului
		else
		{
			scanf("%ld",&nr);
			if(op==1){ insereaza(nr); c[++q]=nr; }
			if(op==2) elimina(c[nr]);
		}
	}
return 0;}