Cod sursa(job #1042248)

Utilizator a96tudorAvram Tudor a96tudor Data 26 noiembrie 2013 19:36:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<cstdio>

#define N_MAX 200010
using namespace std;

int N,i,k,x,n,Nr,poz[N_MAX],H[N_MAX],A[N_MAX];

inline void swap(int a,int b)
{
    int aux;
    aux=H[a];
    H[a]=H[b];
    H[b]=aux;
    poz[H[a]]=a;
    poz[H[b]]=b;
}

inline void Heap_Down(int k)
{
    int St=k*2,Dr=k*2+1,p;
    if (St<=Nr)
        {
            p=St;
            if (Dr<=Nr && A[H[Dr]]<A[H[St]]) p=Dr;
            if (A[H[p]]<A[H[k]])
                {
                    swap(k,p);
                    Heap_Down(p);
                }
        }
}

inline void Heap_Up(int k)
{
    int t=k/2;
    if (t>0 && A[H[k]]<A[H[t]])
        {
            swap(k,t);
            Heap_Up(t);
        }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&N);
    for (i=1;i<=N;i++)
    {
        scanf("%d",&k);
        if (k==1)
            {
                scanf("%d",&x);
                A[++n]=x;
                H[++Nr]=n;
                poz[n]=Nr;
                Heap_Up(Nr);
            }
        if (k==2)
            {
                scanf("%d",&x);
                int c=poz[x];
                swap(poz[x],Nr);
                Nr--;
                Heap_Down(c);
            }
        if (k==3) printf("%d\n",A[H[1]]);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}