Cod sursa(job #342987)

Utilizator aghamatMorariu Razvan aghamat Data 24 august 2009 15:47:58
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#define DIM 200005

int c[DIM], h[DIM], poz[DIM];
int n,m,nr;

void swap(int &x, int &y)
{
	int tmp=x;
	x=y;
	y=tmp;
}

void upheap(int nod)
{
	if (nod>1)
	if (c[h[nod]]<c[h[nod/2]])
		{
			swap(poz[h[nod]],poz[h[nod/2]]);
			swap(h[nod],h[nod/2]);
			upheap(nod/2);
		}
}

void insert(int nod)
{
	c[++n]=nod;
	h[++nr]=n;
	poz[n]=nr;
	upheap(nr);
}


void downheap(int nod)
{
	int min=nod;
	if (nr>=2*nod) if (c[h[nod*2]]<c[h[min]]) min=nod*2;
	if (nr>=2*nod+1) if (c[h[nod*2+1]]<c[h[min]]) min=nod*2+1;
	if (min!=nod)
		{
			swap(h[nod],h[min]);
			swap(poz[h[nod]],poz[h[min]]);
			downheap(min);
		}
}

void cut(int nod)
{
	c[h[poz[nod]]]=-1;
	upheap(poz[nod]);
	h[1]=h[nr--];
	downheap(1);
}


int main()
{
	freopen("heapuri.in","r",stdin);
	freopen("heapuri.out","w",stdout);
	int i,car,p;

	scanf("%d",&m);
	for (i=1; i<=m; ++i)
		{
			scanf("%d",&car);
			if (car==1)
				{
					scanf("%d",&p);
					insert(p);

				}
			else if (car==2)
				{
					scanf("%d",&p);
					cut(p);
				}
			else printf("%d\n",c[h[1]]);
		}
return(0);
}