Cod sursa(job #1460702)

Utilizator CollermanAndrei Amariei Collerman Data 13 iulie 2015 16:48:14
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
using namespace std;
ofstream fout("heapuri.out");
ifstream fin("heapuri.in");
const int NMAX = 200005;

int n, cod, x, lg, nr;
int v[NMAX], poz[NMAX], Heap[NMAX];

void hswap(int nod1, int nod2);
int left_son(int nod) { return nod * 2; }
int right_son(int nod) { return nod * 2 + 1; }
int father(int nod) { return nod / 2; }
void sift(int nod)
{
    int son = 1;

    while(son) {
        son = 0;
        if(left_son(nod) <= lg) {
            son = left_son(nod);
            if( right_son(nod) <= lg && v[Heap[right_son(nod)]] < v[Heap[son]] )
                son = right_son(nod);
            if( v[Heap[right_son(nod)]] > v[Heap[nod]] && v[Heap[left_son(nod)]] > v[Heap[nod]] )
                son = 0;
        }

        if(son) {
            hswap(son, nod);
            nod = son;
        }
    }
}
void percolate(int nod)
{
    while((nod > 1) && (v[Heap[nod]] < v[Heap[father(nod)]]) ) {
        hswap(nod, father(nod));
        nod = father(nod);
    }
}

void hswap(int nod1, int nod2)
{
    swap(Heap[nod1], Heap[nod2]);
    swap(poz[Heap[nod1]], poz[Heap[nod2]]);
}

void add_node(int val)
{
    v[++nr] = val;
    Heap[++lg] = nr;
    poz[nr] = lg;
    percolate(lg);
}

void delete_node(int val)
{
    hswap(val, lg);
    lg--;
    sift(val);
}

int main()
{
    fin >> n;
    for(int i=1; i<=n; i++)
    {
        fin >> cod;
        switch(cod)
        {
            case 1: { fin >> x; add_node(x); break; }
            case 2: { fin >> x; delete_node(poz[x]); break; }
            case 3: { fout << v[Heap[1]] << '\n'; break; }
        }
    }
    return 0;
}