Cod sursa(job #1300379)

Utilizator EpictetStamatin Cristian Epictet Data 24 decembrie 2014 13:26:58
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int N, t, val, nr, cr, num, A[200010], Poz[200010], V[200010];

void Insert_Heap(int x)
{
    int fiu = ++nr;
    int tata = nr / 2;
    V[nr] = x;
    while (tata && V[tata] > x)
    {
        swap(Poz[V[fiu]], Poz[V[tata]]);
        V[fiu] = V[tata];
        V[tata] = x;
        fiu = tata;
        tata = fiu / 2;
    }
}

void Erase_Heap(int x)
{
    swap(V[Poz[x]], V[nr]);
    swap(Poz[V[nr--]], Poz[x]);
    int v = V[Poz[x]];
    if (v < V[Poz[x] / 2])
    {
        int fiu = Poz[x];
        int tata = fiu / 2;
        while (tata && V[tata] > v)
        {
            swap(Poz[V[fiu]], Poz[V[tata]]);
            V[fiu] = V[tata];
            V[tata] = v;
            fiu = tata;
            tata = fiu / 2;
        }
    }
    else
    {
        int tata = Poz[x], fiu = Poz[x] * 2;
        while (fiu <= nr)
        {
            if (fiu < nr)
            {
                if (V[fiu] > V[fiu + 1]) fiu += 1;
            }
            if (V[fiu] < v)
            {
                swap(Poz[V[tata]], Poz[V[fiu]]);
                V[tata] = V[fiu];
                V[fiu] = v;
                tata = fiu;
                fiu = tata * 2;
            }
            else
            {
                fiu = nr + 1;
            }
        }
    }
}

int Extract_Min()
{
    return V[1];
}

int main()
{
    fin >> N;
    for (int i = 1; i <= N; i++)
    {
        fin >> t;
        switch (t)
        {
            case 1 :
            {
                fin >> val;
                A[++num] = val;
                Poz[val] = num;
                Insert_Heap(val);
                break;
            }
            case 2 :
            {
                fin >> val;
                Erase_Heap(A[val]);
                break;
            }
            case 3 :
            {
                fout << Extract_Min() << '\n';
                break;
            }
        }
    }

    fout.close();
    return 0;
}