Cod sursa(job #563949)

Utilizator VladberilaVladutz Vladberila Data 26 martie 2011 14:09:40
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
using namespace std;
unsigned long n,nr=0;
long T[200000],poz[100000];
ifstream f("heapuri.in");
ofstream g("heapuri.out");
void insert(long);
void combina(long,long);
void citire()
{
	int i,a,x;
	f>>n;
	for(i=1;i<=n;i++)
	{
		f>>a;
		if(a==1)
		{
			f>>x;
			insert(x);
		}
		if(a==2)
		{
			f>>x;
			T[poz[x]]=T[nr];
			combina(poz[x],nr-1);
			nr--;
		}
		if(a==3)
			g<<T[1]<<'\n';
	}
}
void insert(long x)
{
	long fiu=++nr, tata=fiu/2,k,aux;
	poz[nr]=nr;
	k=nr;
	while(tata && x<T[tata])
	{
		T[fiu]=T[tata];
		aux=poz[k];
		poz[k]=poz[tata];
		poz[tata]=aux;
		fiu=tata;
		tata=fiu/2;
	}
	T[fiu]=x;
}
void combina(long i,long n)
{
	long tata=i,fiu=2*i,v=T[i];
	while(fiu<=nr)
	{
		if(fiu<nr)
			if(T[fiu]>T[fiu+1])
				++fiu;
		if(v>T[fiu])
		{
			T[tata]=T[fiu];
			tata=fiu;
			fiu*=2;
		}
		else
			fiu=nr+1;
	}
	T[tata]=v;
}
int main()
{
	citire();
	for(int i=1;i<=nr;i++)
		cout<<poz[i]<<' ';
	return 0;
}