Cod sursa(job #648592)

Utilizator ms-ninjacristescu liviu ms-ninja Data 13 decembrie 2011 19:48:52
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
using namespace std;
#define dim 200001
#define inf 0x3f3f3f3f
int v[dim],poz,val,coada[dim],contor=1;

void update(int nod)
{
	if(nod==1)
		return;
	if(v[nod/2]>v[nod])
	{
	int	aux=v[nod/2];
		v[nod/2]=v[nod];
		v[nod]=aux;
		update(nod/2);
	}
}

void update1(int nod)
{
	if(v[nod]>v[nod*2] && nod*2<=contor)
	{
	int	aux=v[nod];
		v[nod]=v[nod*2];
		v[nod*2]=aux;
		update1(nod*2);
	}
	if(v[nod]>v[nod*2+1] && nod*2+1<=contor)
	{
	int	aux=v[nod];
		v[nod]=v[nod*2+1];
		v[nod*2+1]=aux;
		update1(nod*2+1);
	}
}

void sterge(int nod)
{
	if(poz==v[nod])
	{
		if(nod==1)
		{
			v[1]=inf;
			update(contor);
		}
		v[nod]=inf;
		update1(nod);
		poz=0;
		return;
	}
	
	if(v[nod*2]<=poz)
		sterge(nod*2);
	if(v[nod*2+1]<=poz)
		sterge(nod*2+1);
	
}

int main()
{
	ifstream fin("heapuri.in");
	ofstream fout("heapuri.out");
	int n, i,x;
	
	fin>>n;
	fin>>x >>v[1];
	coada[1]=v[1];
	for(i=2;i<=n;++i)
	{
		int tip=0;
		fin>>tip;
		if(tip==1)
		{
		++contor;
		fin>>v[contor];
		coada[contor]=v[contor];
		update(contor);
		}
		else
			if(tip==2)
			{
				fin>>val;
				poz=coada[val];
				sterge(1);
			}
			else
				fout<<v[1]<<'\n';
		
	}
	
	return 0;
}