Cod sursa(job #1052948)

Utilizator uagamagaMatei Rogoz uagamaga Data 11 decembrie 2013 22:22:52
Problema Heapuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#include <stdlib.h>

int H[1000001],n,ret[1000001],rn,pos[1000001],x;

int father(int nod){return nod>>1;}
int right_son(int nod){return (nod<<1)+1;}
int left_son(int nod){return nod<<1;}
int min(){return ret[H[1]];}
void swap(int nod1,int nod2)
{
    int aux;
    aux = H[nod1];
    H[nod1] = H[nod2];
    H[nod2] = aux;
    pos[H[nod1]] = nod1;
    pos[H[nod2]] = nod2;
}
void up(int nod)
{

    if(nod==1 || ret[H[nod]]>=ret[H[father(nod)]]) return;
    swap(nod,father(nod));
    up(father(nod));
}
void dw(int nod)
{
    if(left_son(nod)>n || !H[nod]) return;
    if(ret[H[nod]]>ret[H[left_son(nod)]] && ret[H[nod]]>ret[H[right_son(nod)]] && ret[H[left_son(nod)]]<ret[H[right_son(nod)]])
    {
        swap(nod,left_son(nod));
        dw(left_son(nod));
    }
    else
    {
        if(ret[H[nod]]>ret[H[left_son(nod)]] && ret[H[nod]]>ret[H[right_son(nod)]])
        {
            swap(nod,right_son(nod));
            dw(right_son(nod));
        }
        else
        {
            if(ret[H[nod]]>ret[H[left_son(nod)]])
            {
                swap(nod,left_son(nod));
                dw(left_son(nod));
            }
            else
            {
                if(ret[H[nod]]>ret[H[right_son(nod)]])
                {
                    swap(nod,right_son(nod));
                    dw(right_son(nod));
                }

            }
        }
    }

}
void INS()
{
    ret[++rn] = x;
    H[++n] = rn;
    pos[rn] = n;
    up(n);
}
void DEL()
{
    H[pos[x]] = H[n];

    n--;

    if(pos[x]>1 && H[pos[x]]<H[father(pos[x])])
        up(pos[x]);
    else
        dw(pos[x]);
}


int main()
{
    int i,nr,op;

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

    scanf("%d",&nr);


    while(nr--)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&x);
            INS();
        }
        if(op==2)
        {
            scanf("%d",&x);
            DEL();
        }
        if(op==3)
        {
            printf("%d\n",min());
        }
    }

    return 0;
}