Cod sursa(job #1146707)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 19 martie 2014 11:05:46
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstdio>
# define N 200010
#include <vector>
#define val first
#define poz second
using namespace std;
pair<int,int> H[N];
int x,F,T,P[N],left,l,t,i,op,p,j;
void up()
{
    //val=H[F].val;
    while(T&&H[F].val<H[T].val)
    {
        swap(H[F],H[T]);
        P[H[F].poz]=F;
        P[H[T].poz]=T;
        T/=2;
        F/=2;
    }
}
void down()
{
    while(1)
    {
        F=T*2;
        if(F>l)
            break;
        if(F<=l)
        {
            if(F+1<=l&&H[F+1].val<H[F].val)
                F++;
            if(H[F].val>=H[T].val)break;;
            swap(H[F],H[T]);
            P[H[F].poz]=F;
            P[H[T].poz]=T;
            T=F;
        }
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&t);
    for(i=1;i<=t;i++)
    {
        scanf("%d",&op);
        if(op==3)
        {
            printf("%d\n",H[1].val);
            continue;
        }
        scanf("%d",&x);
        if(op==1)
        {
            H[++l].val=x;
            H[l].poz=++p;
            P[i]=l;
            F=l;
            T=F/2;
            up();
            continue;
        }
        if(op==2)
        {
            j=P[x];
            F=j;
            T=F/2;
            H[j]=H[l--];
            up();
            T=j;
            down();
        }
    }
    return 0;
}