Cod sursa(job #854196)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 12 ianuarie 2013 21:47:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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;
}