Cod sursa(job #505915)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 4 decembrie 2010 15:00:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#define Nmx 200001

using namespace std;


int poz[Nmx*4],A[Nmx*4],H[Nmx*4];
int n,nr;

void up(int k)
{
    while(k>1)
    {
        if(A[H[k/2]]<=A[H[k]])
            break;
        int aux=H[k/2];
        H[k/2]=H[k];
        H[k]=aux;
        poz[H[k]]=k;
        poz[H[k/2]]=k/2;
        k/=2;
    }
}

void down(int k)
{
    while(k*2<=nr)
    {
        int t=k*2;
        if(t+1<=nr&&A[H[t]]>A[H[t+1]])
            t=t+1;
        int aux=H[t];
        H[t]=H[k];
        H[k]=aux;
        poz[H[k]]=k;
        poz[H[t]]=t;
        k=t;
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    int t,x,nrp=0;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&t);
        if(t==3)
            printf("%d\n",A[H[1]]);
        else if(t==1)
        {
            nrp++;
            scanf("%d",&x);
            A[nrp]=x;
            H[++nr]=nrp;
            poz[nrp]=nr;
            up(nr);
        }
        else if(t==2)
        {
            scanf("%d",&x);
            A[x]=-1;
            up(poz[x]);
            poz[H[1]]=0;
            H[1]=H[nr--];
            poz[H[1]]=1;
            if(nr>1) down(1);
        }
    }
    return 0;
}