Cod sursa(job #258338)

Utilizator oumbraPaul Filimoon oumbra Data 14 februarie 2009 23:58:44
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>

#define SIZE_H 200005 

int HEAP[SIZE_H];
int HEAP_POS[SIZE_H];
int HEAP_VAL[SIZE_H];

int HEAP_N;
int T;
int N;

int ih(int val)
{
	int tmp, pos;
	
	HEAP_N++; T++;
	
	HEAP_VAL[T] = val;
	
	HEAP[HEAP_N] = T;
	
	HEAP_POS[T] = HEAP_N;

	pos = HEAP_N;

	while(pos > 1 && HEAP_VAL[HEAP[pos]] < HEAP_VAL[HEAP[pos/2]])
	{
		tmp = HEAP[pos];
		HEAP[pos] = HEAP[pos/2];
		HEAP[pos/2] = tmp;

		HEAP_POS[HEAP[pos]] = pos;
		HEAP_POS[HEAP[pos/2]] = pos/2;

		pos /= 2;
	}
		
}

int sh(int heap_pos)
{
	HEAP[HEAP_POS[heap_pos]] = HEAP[HEAP_N];
	HEAP_POS[HEAP[HEAP_POS[heap_pos]]] = HEAP_POS[heap_pos];

	int tmp, tmp2, pos = HEAP_POS[heap_pos];

	HEAP_N--;
	HEAP_POS[heap_pos] = 0;

        while(pos < HEAP_N)
        {
		if(pos*2 <= HEAP_N && HEAP_VAL[HEAP[pos]] > HEAP_VAL[HEAP[pos*2]])
		{
			tmp = pos*2;
		}
		else
		{
			tmp = pos;
		}		
			if(pos*2+1 <= HEAP_N && HEAP_VAL[HEAP[tmp]] > HEAP_VAL[HEAP[pos*2+1]])
			{
				tmp = pos*2+1;
			}
		
			
		if(pos != tmp)
		{
			tmp2 = HEAP[pos];
			HEAP[pos] = HEAP[tmp];
			HEAP[tmp] = tmp2;

			HEAP_POS[HEAP[pos]] = pos;
			HEAP_POS[HEAP[tmp]] = tmp;

			pos = tmp;
		}
		else
		{
			pos = HEAP_N;
		}	
        }	
		
}

int main()
{
	int i, j, tmp, tmpx;

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

	scanf("%d", &N);

	for(i=1; i<=N; i++)
	{
		scanf("%d", &tmp);	
		
		switch(tmp)
		{		
			case 3:
			{
				printf("%d\n", HEAP_VAL[HEAP[1]]);
				break;
			}

			case 2:
			{
				scanf("%d", &tmpx);
				sh(tmpx);
				break;
			}

			case 1:
			{
				scanf("%d", &tmpx);
				ih(tmpx);
				break;
			}
		}
	}

	return 0;
}