Cod sursa(job #1042179)

Utilizator roby2001Sirius roby2001 Data 26 noiembrie 2013 17:37:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
/*
          ~Keep It Simple!~
*/




#include <stdio.h>

int heap[200001],positions[200001],revpos[200001],n,nr,nro;

void swap(int v[],int a,int b)
{
	int aux = v[a];
	v[a] = v[b];
	v[b] = aux;
}

void Update(int node)
{
	while( node/2 > 0 )
	{
		if( heap[node/2] > heap[node] )
		{
			swap(heap,node/2,node);
			swap(positions,revpos[node/2],revpos[node]);
			swap(revpos,node,node/2);
			node/=2;
		}
		else
			return;
	}
}
void Add(int node,int value,int who)
{
	heap[node] = value;
	positions[who] = node;
	revpos[node] = who;
	Update(node);
}
void GoDown(int node)
{
	int sw = 0;
	while(node<=n)
	{
		if(2*node <= nr && heap[2*node] < heap[node] && heap[2*node] < heap[2*node+1] )
			node = 2*node,sw=1;
		else if( 2*node+1 <= nr && heap[2*node+1] < heap[node])
			node = 2*node+1,sw=1;
		if ( node/2 > 0 && sw == 1)
		{
			swap(heap,node/2,node);
			swap(positions,revpos[node/2],revpos[node]);
			swap(revpos,node,node/2);
		sw = 0;
		}
		else
			return;
	}
}

void Remove(int node_position)
{
	int node = positions[node_position];
    heap[node] = -1;
    Update(node);
	heap[1] = heap[ nr-- ];
	GoDown(1);
}


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

	scanf("%d",&n);
	int x,y;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		if( x == 3 ) 
			printf("%d\n",heap[1]);
		else if( x == 1 )
		{
			scanf("%d",&y);
			Add(++nr,y,++nro);
		}
		else if( x == 2 )
		{
			scanf("%d",&y);
			Remove(y);
		}
	}
}