Cod sursa(job #407514)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 martie 2010 13:31:09
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<stdio.h>

#define Nmax 200010

int A[Nmax],Heap[Nmax],p[Nmax],N;

void swap(int i,int j)
{
    int aux=Heap[i];
    Heap[i]=Heap[j];
    Heap[j]=aux;

    p[Heap[i]]=i;
    p[Heap[j]]=j;
}

void up_heap(int poz)
{
    for(; poz>1 ; poz/=2)
        if (A[Heap[poz]] < A[Heap[poz/2]])
            swap(poz,poz/2);
}

void down_heap(int k)
{
    for(int fiu=1;fiu;)
        {
        fiu=0;
        if (2*k<=N)
            {
            fiu=2*k;
            if (2*k+1<=N && A[Heap[fiu]] > A[Heap[2*k+1]])
                fiu=2*k+1;
            }
        if (fiu && A[Heap[k]] > A[Heap[fiu]])
            {
            swap(k,fiu);
            k=fiu;
            }
        else
            fiu=0;
        }
}

int main()
{
    int M,x,y,poz;
    freopen("heap.in","r",stdin);
    freopen("heap.out","w",stdout);
    scanf("%d",&M);
    for(int i=1;i<=M;++i)
        {
        scanf("%d",&x);
        if (x==1)
            {
            scanf("%d",&A[i]);
            p[i]=++N;
            Heap[N]=i;
            up_heap(N);
            }
        if (x==2)
            {
            scanf("%d",&y);
            poz=p[y];
            swap(poz,N);
            --N;
            down_heap(poz);
            }
        if (x==3)
            printf("%d\n",A[Heap[1]]);
        }
    return 0;
}