Cod sursa(job #1151914)

Utilizator SilverGSilver Gains SilverG Data 24 martie 2014 13:54:48
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
/*
    Keep It Simple!
*/

#include<stdio.h>

#define MaxN 200001

int A[MaxN],N,Heap[MaxN],Number_Of_Heap_Elements,Number_Of_Elements;
int InHeapLocation[MaxN];

void GoUp(int node)
{
		while( node/2 > 0 && A[Heap[node]] < A[Heap[node/2]])
		{
				int aux = Heap[node/2];
				Heap[node/2] = Heap[node];
				Heap[node] = aux;

				InHeapLocation[Heap[node]] = node;
				InHeapLocation[Heap[node/2]] = node/2;

				node /= 2;
		}
}

void AddToHeap(int position,int value)
{
	Heap[++Number_Of_Heap_Elements] = position;
	A[position] = value;
	InHeapLocation[position] = Number_Of_Heap_Elements;

	GoUp(Number_Of_Heap_Elements);
}

void GoDown(int node)
{
		int sw = 1,x = -1;
		while(node < Number_Of_Heap_Elements && sw)
		{
			  x = node,sw=0;
				if(2*node <= Number_Of_Heap_Elements && A[Heap[node]] > A[Heap[2*node]]) x = 2*node,sw=1;
				if(2*node+1 <= Number_Of_Heap_Elements && A[Heap[2*node]] > A[Heap[2*node+1]] && A[Heap[node]] > A[Heap[2*node+1]]) x = 2*node+1,sw=1;

				int aux = Heap[x];
				Heap[x] = Heap[node];
				Heap[node] = aux;

				InHeapLocation[Heap[node]] = node;
				InHeapLocation[Heap[x]] = x;
				node = x;
		}
}

void Remove(int who)
{
		Heap[InHeapLocation[who]] = Heap[Number_Of_Heap_Elements];
		InHeapLocation[Heap[Number_Of_Heap_Elements]] = InHeapLocation[who];
		Number_Of_Heap_Elements--;
		InHeapLocation[who] = -1;
		GoDown(1);
}

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

		scanf("%d",&N);

		int type,x;

		for(int i=1;i<=N;i++)
		{
				scanf("%d",&type);

				if( type == 3 )
					printf("%d\n",A[Heap[1]]);
				else if( type == 1 )
				{
					scanf("%d",&x);
					AddToHeap(++Number_Of_Elements,x);
				}
				else if( type == 2 )
				{
					scanf("%d",&x);
					Remove(x);
				}
		}
}