Cod sursa(job #542231)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 25 februarie 2011 23:40:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<iostream>
#include<fstream>
using namespace std;

class Heap{
	int dim,v[200001];
	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[200001],poz[200001],crono=1;

void heapify(Heap& H, const 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)]=indmin;
		poz[H.get(ind)]=ind;
		heapify(H,indmin);
	}
}

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

	while(ind>1 && valori[H.get(parinte(ind))]>valori[valoare])
	{
		H.put(ind,H.get(parinte(ind)));
		poz[H.get(parinte(ind))]=ind;
		ind=parinte(ind);
	}
	H.put(ind,valoare);
	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));
	poz[H.get(dim)]=indice;
	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;
			valori[crono]=val;
			insert(h,crono);
			++crono;
		}
		else if(cod==2)
		{
			in>>val;
			del(h,val);
		}
		else
			out<<getmin(h)<<"\n";
	}
	in.close();
	out.close();
}