Cod sursa(job #542200)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 25 februarie 2011 22:27:15
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<iostream>
#include<fstream>
using namespace std;

class Heap{
	int dim,v[200000];
	public:
		Heap(int dim)
		{
			this->dim=dim;
		}
		void put(const int& indice, const int&val)
		{
			v[indice]=val;
		}
		int get(const int& indice)
		{
			return v[indice];
		}
		int get_dim()
		{
			return dim;
		}
		void inc_dim()
		{
			++dim;
		}
		void dec_dim()
		{
			--dim;
		}
};

int parinte(int i)
{
	return i/2;
}

int left(int i)
{
	return 2*i;
}

int right(int i)
{
	return 2*i+1;
}

int valori[200000],poz[200000],crono=1;

void heapify(Heap& H, int& ind)
{
	int indmin=ind;

	if(left(ind)<=H.get_dim() && valori[H.get(ind)]>valori[H.get(left(ind))])
		indmin=left(ind);
	if(right(ind)<=H.get_dim() && valori[H.get(indmin)]>valori[H.get(right(ind))])
		indmin=right(ind);
	if(indmin!=ind)
	{
		int aux=H.get(ind);
		H.put(ind,H.get(indmin));
		H.put(indmin,aux);
		poz[H.get(indmin)]=ind;
		poz[H.get(ind)]=indmin;
		heapify(H,indmin);
	}
}

void insert(Heap& H, const int& valoare)
{
	H.inc_dim();
	H.put(H.get_dim(), valoare);	
	int par=parinte(H.get_dim());
	int ind=H.get_dim();

	while(par>=1 && valori[H.get(par)]>valori[H.get(ind)])
	{
		int aux=H.get(par);
		H.put(par,H.get(ind));
		H.put(ind,aux);
		ind=par;
		par=parinte(par);
	}
	poz[valoare]=ind;
}

void del(Heap& H, const int& valoare)
{
	int dim=H.get_dim();

	if(dim==1)
	{
		H.dec_dim();
		return;
	}
	int indice=poz[valoare];
	H.put(indice,H.get(dim));
	H.dec_dim();
	heapify(H,indice);
}

int getmin(Heap& H)
{
	return valori[H.get(1)];
}

int main()
{
	ifstream in("heapuri.in");
	ofstream out("heapuri.out");

	int n,cod;
	in>>n;
	Heap h(0);
	for(int i=0;i<n;i++)
	{
		in>>cod;
		int val;
		if(cod==1) //insert
		{
			in>>val;
			insert(h,crono);
			valori[crono]=val;
			++crono;
		}
		else if(cod==2)
		{
			in>>val;
			del(h,val);
		}
		else
			out<<getmin(h)<<"\n";
	}
	in.close();
	out.close();
}