Cod sursa(job #820567)

Utilizator mariacMaria Constantin mariac Data 21 noiembrie 2012 00:46:01
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int poz[200000],heap[200000],ordin[200000],k=0,j=0;
void add()
{	
	int x;
	fin>>x;
	poz[++k]=++j;
	ordin[j]=k;
	heap[j]=x;
	int j2;
	j2=j;
	while(j>1&&heap[j/2]>heap[j])
		{
			int aux;
			aux=heap[j/2];
			heap[j/2]=heap[j];
			heap[j]=aux;
			poz[ordin[j/2]]=j;
			poz[ordin[j]]=j/2;
			aux=ordin[j/2];
			ordin[j/2]=ordin[j];
			ordin[j]=aux;
			j=j/2;
		}
	j=j2;
}

void remove()
{ 
	int x,u,p,aux;
	fin>>x;
	u=poz[x];
	heap[u]=heap[j];
	heap[j]=0;
	ordin[u]=ordin[j];
	poz[ordin[j]]=u;
	j--;
	while(heap[2*u]&&(heap[2*u]<heap[u]||(heap[2*u+1]&&heap[2*u+1]<heap[u])))
		{
			if(heap[2*u+1]&&heap[2*u+1]<heap[2*u])p=2*u+1;
				else p=2*u;
			aux=heap[p];
			heap[p]=heap[u];
			heap[u]=aux;
			poz[ordin[p]]=u;
			poz[ordin[u]]=p;
			aux=ordin[p];
			ordin[p]=ordin[u];
			ordin[u]=aux;
			u=p;
		}
}

void afish(){fout<<heap[1]<<"\n";}
			
			
			
	



int main()
{
	int n,i,x;
	fin>>n;
	for(i=1;i<=n;i++)
		{
			fin>>x;
			if(x==1)add();
 			if(x==2)remove();
			if(x==3)afish();
		}
	return 0;
}