Cod sursa(job #330423)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 9 iulie 2009 22:29:00
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<stdio.h>
#define Nmx 200010

int n,nr,L;
int Heap[Nmx],pz[Nmx],A[Nmx];

void push(int k)
{
    int t;

    while(k>1&&A[Heap[k/2]]>A[Heap[k]])
    {
        t=Heap[k];
        Heap[k]=Heap[k/2];
        Heap[k/2]=t;

        pz[Heap[k]]=k;
        pz[Heap[k/2]]=k/2;

        k=k/2;
    }

}

void scot(int k)
{
    while((k*2<=n&&A[Heap[k*2]]<A[Heap[k]])||
          (k*2+1<=n&&A[Heap[k*2+1]]<A[Heap[k]]))
    {
        if(k*2+1<=n)
         {
          if(A[Heap[k*2]]<A[Heap[k*2+1]])
          {
            int t=Heap[k];
            Heap[k]=Heap[k*2];
            Heap[k*2]=t;

            pz[Heap[k]]=k;
            pz[Heap[k*2]]=k*2;

            k=k*2;
          }
        else{
            int t=Heap[k];
            Heap[k]=Heap[k*2+1];
            Heap[k*2+1]=t;

            pz[Heap[k]]=k;
            pz[Heap[k*2+1]]=k*2+1;

            k=k*2+1;
           }
         }
       else {
            int t=Heap[k];
            Heap[k]=Heap[k*2];
            Heap[k*2]=t;

            pz[Heap[k]]=k;
            pz[Heap[k*2]]=k*2;

            k=k*2;
        }
    }

}


int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);

    scanf("%d",&nr);
    int tip,x;
    for(int i=1;i<=nr;++i)
    {
        scanf("%d",&tip);
        if(tip==3)
            printf("%d\n",A[Heap[1]]);
        else
        {
            scanf("%d",&x);
            if(tip==1)
            {
                n++;L++;
                A[L]=x;
                Heap[n]=L;
                pz[L]=n;
                push(n);
            }
            else {
                A[x]=-1;
                push(pz[x]);
                pz[Heap[1]]=0;
                Heap[1]=Heap[n--];
                pz[Heap[1]]=1;
                if(n>1) scot(1);
            }
        }
    }

    return 0;
}