Cod sursa(job #357960)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 21 octombrie 2009 13:23:21
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
int M;
int heap[200024],N,aux;
void insereaza(int x)
{
    heap[++N]=x;
    int nod,aux;
    for(nod=N;nod>1;nod/=2)
        if(heap[nod]<heap[nod/2])
        {
            aux=heap[nod];
            heap[nod]=heap[nod/2];
            heap[nod/2]=aux;
        }
}

void stergere(int nod)
{
    heap[nod]=heap[N];
    --N;
    if(heap[nod]<heap[nod/2] && nod!=1)
       for(nod=N;nod>1;nod/=2)
        if(heap[nod]<heap[nod/2])
        {
            aux=heap[nod];
            heap[nod]=heap[nod/2];
            heap[nod/2]=aux;
        }
        else
            for (;nod*2<=N;)
            {
                int val=heap[2*nod],imin=2*nod;
                if(nod*2+1<=N && heap[2*nod+1]<heap[2*nod])
                    val=heap[2*nod+1], imin=2*nod+1;

                if (heap[nod]<=heap[imin])
                    return ;

                int aux=heap[nod];
                heap[nod]=heap[imin];
                heap[imin]=aux;
                nod=imin;
            }
}

int main()
{
    int i,tip,x,nod;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&M);
    for(i=1;i<=M;++i)
    {
        scanf("%d",&tip);
        if (tip==1)
        {
            scanf("%d",&x);
            insereaza(x);
        }
        else
            if(tip==2)
            {
                scanf("%d",&nod);
                stergere(nod);
            }
            else
                if(tip==3)
                    printf("%d\n",heap[1]);
    }
    return 0;
}