Cod sursa(job #782706)

Utilizator PatrikStepan Patrik Patrik Data 29 august 2012 10:37:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
	#include<stdio.h>
	#define MAX 200001 
	using namespace std;
	FILE *f , *g ;
	int h[MAX] , p[MAX] , x[MAX] , n  , tip , a , q; 
	
	void down(int i);
	void up(int i);
	void swap( int &a , int &b)
	{
		int aux = a;
		a = b;
		b = aux;
	}
	
	int main()
	{
		f=fopen("heapuri.in" , "r" );
		g=fopen("heapuri.out" , "w");
		
		fscanf(f , "%d" , &n );
		
		for( int i = 1; i <=  n ; ++i )
		{
			fscanf(f , "%d" , &tip );
			if(tip == 1)
			{
				fscanf(f , "%d" , &a);
				h[++q] = a;
				p[++p[0]] = q;
				x[q] = p[0];
				up(q);
			}
			else
				if(tip == 2)
				{
					fscanf(f , "%d" , &a );
					int aux = p[a];
					swap(h[p[a]],h[q]);
					int aux1 = x[q];
					swap(x[p[a]],x[q]);
					swap(p[a],p[aux1]);
					q--;
					down(aux);
				}
				else
				if(tip == 3)
				{
					fprintf(g , "%d\n" , h[1]);
				}
		}
		
		fclose(f);
		fclose(g);
		return 0;
	}
	
	void down(int i)
	{
		int min  = i;
		if(2*i <= q && h[i] > h[2*i])
			min = 2*i;
		if(2*i+1 <= q && h[min] > h[2*i+1])
			min = 2*i+1;
		if(min != i)
		{
			swap(h[i],h[min]);
			swap(x[i],x[min]);
			swap(p[x[i]],p[x[min]]);
			down(min);
		}
	}
	
	void up(int i)
	{
		if(i/2 && h[i/2] > h[i])
		{
			swap(h[i] , h[i/2]);
			swap(x[i] , x[i/2]);
			swap(p[x[i]] , p[x[i/2]]);
			up(i/2);
		}
	}