Cod sursa(job #1571686)

Utilizator valentinpielePiele Valentin valentinpiele Data 18 ianuarie 2016 12:53:56
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;

const int Nmax = 200001;

int nr_q;
int tip;
int numar;

int val[Nmax];
int heap[Nmax];
int poz[Nmax];

int nre, nrh;
int tb_sters;


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

inline int tata(int nod) { return nod / 2; }
inline int fiu_stanga(int nod) { return nod * 2; }
inline int fiu_dreapta(int nod) { return nod * 2 + 1; }


void schimba(int nod1, int nod2)
{
    int aux;
    aux = heap[nod1];
    heap[nod1] = heap[nod2];
    heap[nod2] = aux;

    poz[ heap[nod1] ] = nod1;
    poz[ heap[nod2] ] = nod2;
}
void urca(int nod)
{
    if(val[ heap[tata(nod)] ] > val[ heap[nod] ] && nod > 1)
        {
            schimba(tata(nod), nod);
            urca( tata(nod) );
        }
}


void coboara(int nod)
{
    int ales = nod;
    if(fiu_stanga(nod) <= nrh && val[ heap[nod] ] > val[ heap[fiu_stanga(nod)] ]) ales = fiu_stanga(nod);
    if(fiu_dreapta(nod) <= nrh && val[ heap[nod] ] > val[ heap[fiu_dreapta(nod)] ]) ales = fiu_dreapta(nod);

    if(ales != nod)
    {
        schimba(ales, nod);
        coboara(ales);
    }
}

int main()
{

    f >> nr_q;
    for(int i = 1; i <= nr_q; i ++)
    {
        f >> tip;
        if(tip == 1)
        {
            f >> numar;
            val[++ nre] = numar;
            heap[++ nrh] = nre;
            poz[ heap[nrh] ] = nrh;
            urca(nrh);
        }
        if(tip == 2)
        {
            f >> numar;
            tb_sters = poz[numar];

            schimba(tb_sters, nrh --);

            coboara(tb_sters);
            urca(tb_sters);

        }

        if(tip == 3) g << val[ heap[1] ] << '\n';

    }
    return 0;
}