Cod sursa(job #1835789)

Utilizator valentinoMoldovan Rares valentino Data 27 decembrie 2016 14:01:29
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <algorithm>
#define NM 200005
using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

int heap[NM], poz[NM], n, ord[NM], ordin;

void coboara(int k)
{
    int son;
    do
    {
        son = 0;
        if((k << 1) <= n)
        {
            son = k << 1;
            if(heap[ k << 1 + 1 ] < heap[ son ] && k << 1 + 1 <= n)
                son = k << 1 + 1;
            if(heap[son] > heap[k]) son = 0;
        }
        if(son)
        {
            swap(heap[ k ], heap[ son ]);
            swap(ord[ k ], ord[ son ]);
            swap(poz[ ord[ k ] ], poz[ ord[ son ] ]);
        }
    }
    while(son);
}

void urca(int k)
{
    while(k > 1 && heap[ k ] < heap[ k >> 1 ])
    {
        swap(ord[ k ], ord[ k >> 1 ]);
        swap(heap[ k ], heap[ k >> 1 ]);
        swap(poz[ ord[k] ], poz[ ord[k >> 1] ]);

        k >>= 1;
    }
}

void insereaza(int val)
{
    ord[ ++n ] = ++ordin;
    heap[n] = val;
    poz[ ordin ] = n;
    urca(n);

}

void sterge(int k)
{
    heap[ k ] = heap[ n ];
    ord[ k ] = ord[ n ];
    poz[ ord[ n-- ] ] = poz[ k ];
    if(k > 1 && heap[ k ] < heap[ k >> 1 ]) urca(k);
    else coboara(k);
}

int main()
{
    int q, cod, x;
    f >> q;
    for(int i = 1; i <= q; ++i)
    {
        f >> cod;
        if(cod == 1)
        {
            f >> x;
            insereaza(x);
        }
        if(cod == 2)
        {
            f >> x;
            sterge(poz[x]);
        }
        if(cod == 3) g << heap[ 1 ] << '\n';
    }
}