Cod sursa(job #1004526)

Utilizator gbi250Gabriela Moldovan gbi250 Data 2 octombrie 2013 22:07:07
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <algorithm>
#define SIZE 200001
using namespace std;

int n, nr, x, op, i, nr_heap, heap[SIZE], pos[SIZE], val[SIZE];

inline int father(int node)
{
    return node/2;
}

inline int left_son(int node)
{
    return 2*node;
}

inline int right_son(int node)
{
    return 2*node+1;
}

inline void percolate(int node)
{
    while(node>1 && val[ heap[node] ] < val[heap[father(node)]])
    {
        swap( pos[heap[node]], pos[heap[father(node)]]);
        swap( heap[node], heap[father(node)] );
        node = father(node);
    }

}

inline void sift(int node)
{
    int son;

    son = node;
    if(left_son(node) <= nr_heap)
    {
        son=left_son(node);
        if(right_son(node) <= nr_heap && val[ heap[son] ] > val[ heap[right_son(node) ] ])
            son=right_son(node);
    }
    if( son!=node )
    {
        swap(pos[ heap[son] ], pos[ heap[node] ]);
        swap(heap[son], heap[node]);
        sift(son);
    }

}

inline void remove_elem(int &nr_heap, int node)
{
    swap(pos[ heap[nr_heap] ], pos[ heap[node] ]);
    swap(heap[nr_heap], heap[node]);
    --nr_heap;
    sift(node);
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &n);
    for(i=1;i<=n;++i)
    {
        scanf("%d", &op);
        if(op==1 || op==2)
        {
            scanf("%d", &x);
            if(op==1)
            {
                val[++nr] = x; // al nr-lea elem din heap are cheia x
                heap[++nr_heap] = nr;
                pos[nr] = nr_heap; // pozitia in heap al elementului intrat al nr-lea
                percolate(nr_heap);
            }
            else
                remove_elem(nr_heap, pos[x]);
        }
        else
            printf("%d\n", val[heap[1]]);
    }
    return 0;
}