Cod sursa(job #398584)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 18 februarie 2010 23:21:05
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
using namespace std;
#include<cstdio>
#include<fstream>
#define MAX 200005
inline int father(int nod){
    return nod/2;
}
inline int left_son(int nod){
    return nod*2;
}
inline int right_son(int nod){
    return nod*2+1;
}

int heap[MAX],//heap
    v[MAX],//elementele in ordinea data
    poz[MAX],//poz[i] pozitia in heap a elementului introdus al i-lea
    n=0,//nr de elemente din heap la mom actual
    N=0;//nr total de elemente introduse in heap,inclusiv cele sterse


void promoveaza(int k)
{
    while((k>1) && (v[heap[father(k)]]>v[heap[k]]))
    {
        swap(heap[k],heap[father(k)]);
        swap(poz[heap[father(k)]],poz[heap[k]]);
        k=father(k);
    }
}

void cerne(int k)
{
    int son;
    do
    {
        son=0;
        if(left_son(k)<=n)
        {
            son=left_son(k);
            if(right_son(k)<=n && v[heap[right_son(k)]]<v[heap[son]])
                son=right_son(k);
            if(v[heap[son]]>=v[heap[k]])
                son=0;
        }
        if(son)
        {
            swap(heap[k],heap[son]);
            swap(poz[heap[k]],poz[heap[son]]);
            k=son;
        }
    }while(son);
}

void add(int valoare)
{
    v[++N]=valoare;
    heap[++n]=N;
    poz[N]=n;
    promoveaza(n);
}

void sterge(int pozitie)
{
    int k=poz[pozitie];
    heap[k]=heap[n];
    n--;
    poz[heap[k]]=k;
    if((k>1) && (v[heap[father(k)]]>v[heap[k]]))
        promoveaza(k);
    else
        cerne(k);
}

void afis()
{
    int i;
    for(i=1;i<=n;i++)
        printf("%d ", heap[i]);
    printf("\n");
    for(i=1;i<=N;i++)
        printf("%d ", v[i]);
    printf("\n");
    for(i=1;i<=N;i++)
        printf("%d ", poz[i]);
    printf("\n");
}

int main()
{
    int i,nrop,op,a;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d", &nrop);
    for(int i=1;i<=nrop;i++)
    {
        scanf("%d", &op);
        if(op==3)
            printf("%d\n", v[heap[1]]);
        else
        {
            scanf("%d", &a);
            if(op==1)
                add(a);
            else
                sterge(a);
        }
    }
    //afis();
    return 0;
}