Cod sursa(job #726512)

Utilizator freakingVlad Eu freaking Data 27 martie 2012 11:55:16
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<stdio.h>
using namespace std;
#define nmax 10001



int Heap[nmax],Val[nmax],Pos[nmax],u;




void percolate(int i)
{
    int aux;
    while(Val[Heap[i/2]] > Val[Heap[i]] && i/2)
    {
        aux=Heap[i/2];
        Heap[i/2]=Heap[i];
        Heap[i]=aux;

        aux=Pos[Heap[i/2]];
        Pos[Heap[i/2]]=Pos[Heap[i]];
        Pos[Heap[i]]=aux;

        i/=2;
    }
}

void sit (int x)
{
    int aux, y = 0;

	while (x != y)
	{
		y = x;

		if (y*2<=u && Val[Heap[x]]>Val[Heap[y*2]]) x = y*2;
		if (y*2+1<=u && Val[Heap[x]]>Val[Heap[y*2+1]]) x = y*2+1;

		aux = Heap[x];
		Heap[x] = Heap[y];
		Heap[y] = aux;

		Pos[Heap[x]] = x;
		Pos[Heap[y]] = y;
    }
}


void insereaza(int a)
{
    u++;
    Heap[u]=u;
    Val[u]=a;
    Pos[u]=u;
    percolate(u);
}

void sterge (int a)
{
    Val[a]=-1;
    percolate(Pos[a]);

    Pos[a]=0;
    Heap[1]=Heap[u--];
    Pos[Heap[1]]=1;
    if (u>1)
    sit(1);
}

void afisare ()
{
    printf("%d \n",Val[Heap[1]]);

}


int main()
{
    int i,a,nod,m;
    freopen("heapuri.out","w",stdout);
    freopen("heapuri.in","r",stdin);
    scanf("%d",&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d",&a);
        switch(a)
        {
            case 1:
            {
                scanf("%d",&nod);
                insereaza(nod);
            }break;
            case 2:
            {
                scanf("%d",&nod);
                sterge(nod);
            }break;
            case 3:
                afisare();
                break;
        }
    }
    return 0;
}