Cod sursa(job #765453)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 7 iulie 2012 18:56:42
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define NRMAX 200001 

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int hp[NRMAX],ap[NRMAX],a[NRMAX],n,nr,l;

void push(int);
void pop(int);

int main()
{
	f>>n;a[0]=1000000000;
	for (int i=1;i<=n;i++)
	{
		int tp,x,p;
		f>>tp;
		switch (tp)
		{
		case 1:
			f>>x;
			push(x);
			break;
		case 2:
			f>>p;
			pop(p);
			break;
		case 3:g<<a[hp[1]]<<'\n';
		}
	}
	f.close();g.close();
	return 0;
}

void push(int val)
{
	nr++;l++;
	a[nr]=val;
	ap[nr]=l;
	hp[l]=nr;
	
	int poz=l;
	while (a[hp[poz]]<a[hp[poz/2]] && poz/2>0)
	{
		int aux=hp[poz];
		hp[poz]=hp[poz/2];
		hp[poz/2]=aux;
		
		int x=hp[poz],y=hp[poz/2];
		aux=ap[x];ap[x]=ap[y];
		ap[y]=aux;
		poz=poz/2;
	}
}

void pop(int poz)
{
	hp[ap[poz]]=0;
	int aux=ap[poz];
	ap[poz]=-1;
	
	poz=aux;
	int poz1=2*poz;
	if (a[hp[poz1]]>a[hp[2*poz+1]]) poz1=2*poz+1;
	while (poz1<=l)
	{
		int aux=hp[poz];
		hp[poz]=hp[poz1];
		hp[poz1]=aux;
		
		ap[hp[poz]]=poz;
		
		poz=poz1;poz1=2*poz;
		if (a[hp[poz1]]>a[hp[2*poz+1]]) poz1=2*poz+1;
	}
	if (poz==l) l--;
}