Cod sursa(job #464995)

Utilizator IrnukIrina Grosu Irnuk Data 22 iunie 2010 20:15:32
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#define NMAX 200001

using namespace std;

long n;
fstream fin,fout;
long heap[NMAX];
long lg;
long v[NMAX];

void adauga(long el)
{
	lg++;
	heap[lg]=el;

	long p=lg;
	while(heap[p]<heap[p/2] && p>1)
	{
		long aux=heap[p];
		heap[p]=heap[p/2];
		heap[p/2]=aux;
		p=p/2;
	}
}

long cauta(long el, long poz)
{
	if(heap[poz]==el)
		return poz;
	else
	{
		if(heap[poz*2]>heap[poz])
			return cauta(el,poz*2);
		if(heap[poz*2+1]>heap[poz])
			return cauta(el,poz*2+1);
	}
	return -1;
}

void swap(long poz1, long poz2)
{
	long aux = heap[poz1];
	heap[poz1]=heap[poz2];
	heap[poz2]=aux;
}

void sterge(long el)
{
	long poz = cauta(el,1);
	long min_poz=0;
	heap[poz]=heap[lg];
	lg--;
	while(poz<=lg && (heap[poz] > heap[poz*2] || heap[poz]>heap[poz*2+1]))
	{
		if(poz*2<=lg && poz*2+1<=lg)
		{
			if(heap[poz*2]<heap[poz*2+1])
				min_poz=poz*2;
			else
				min_poz=poz*2+1;

			if(heap[poz]>heap[min_poz])
				swap(poz,min_poz);
		}
		else
			if(poz*2<=lg && poz*2+1>lg)
			{
				if(heap[poz*2]<heap[poz])
					swap(poz*2,poz);
				return;
			}
			else
				if(poz*2>lg && poz*2+1<=lg)
				{
					if(heap[poz*2+1]<heap[poz])
						swap(poz*2+1,poz);
					return;
				}

		poz=min_poz;

	}
}

void minim()
{
	fout<<heap[1]<<'\n';
}

void citire()
{
	int cod;
	long element;
	fin>>n;
	for(long i=0;i<n;i++)
	{
		fin>>cod;
		
		switch(cod)
		{
		case 1:
			fin>>element;
			v[++v[0]]=element;
			adauga(element);
			break;
		case 2:
			fin>>element;
			sterge(v[element]);
			break;
		case 3:
			minim();
			break;
		}

	}
}

int main()
{
	fin.open("heapuri.in",ios::in);
	fout.open("heapuri.out",ios::out);
	citire();
	
	fin.close();
	return 0;
}