Cod sursa(job #714779)

Utilizator ms-ninjacristescu liviu ms-ninja Data 16 martie 2012 09:40:01
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
using namespace std;
#define dim 200001
#define inf 0x3f3f3f3f
int v[dim],poz,val,coada[dim],contor=1, uz[dim], actual[dim];

void update(int nod)
{
	int tata=nod/2;
	if(coada[v[tata]]>coada[v[nod]])
	{
		swap(v[tata],v[nod]);
		actual[contor]=tata;
		actual[tata]=nod;
		update(nod/2);
	}
}


void downheap(int nod)
{
	int fiu1=nod*2;
	int fiu2=nod*2+1;
	
	if(coada[v[nod]]>coada[v[fiu1]] && fiu1<=contor)
	{
		actual[val]=fiu1;
		actual[v[fiu1]]=nod;
		swap(v[nod],v[fiu1]);
		downheap(fiu1);
	}
	else
	if(coada[v[nod]]>coada[v[fiu2]] && fiu2<=contor)
	{
		actual[val]=fiu2;
		actual[v[fiu2]]=nod;
		swap(v[nod],v[fiu2]);
		downheap(fiu2);
	}
		
}

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