Cod sursa(job #1293366)

Utilizator dragos_musanMusan Dragos dragos_musan Data 15 decembrie 2014 20:12:20
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>

using namespace std;

/*
arbore binar "compact" = arb bin cu toate nivelele complete, mai putin ultimul,
care contine primele k

poate fi retinut intr-un vector: rad pe poz 1; fiii lui i pe poz 2*i si 2*i+1 => tatal lui i este pe i/2
are inaltimea [logn]

heap = arb bin comp cu propr. ca fiecare nod retine o informatie mai buna decat cele ale fiilor => cea mai buna inf se afla in rad
adaugare: pun elementul nou pe ultima poz, apoi urc in heap cat timp e cazul
setrgere: interschimb elementul pe care vreau sa-l sterg cu ultimul, sterg pe ultimul si apoi urc sau cobor in heap
gasirea optimului -> consult radacina
*/

const int N = 200000;

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

int h[N], v[N], poz[N], nrh, nre;
//poz[h[i]] = i (pozitia din h pe care se afla AL i-lea citit)

void schimb(int x, int y)
{
    int aux = h[x];

    h[x] = h[y];
    h[y] = aux;

    poz[h[x]] = x;
    poz[h[y]] = y;
}


void urca(int p)
{
    while(p > 1 && v[h[p]] < v[h[p/2]])
    {
        schimb(p, p/2);
        p /= 2;
    }
}

void coboara(int p)
{
    int fs = 2*p, fd = 2*p + 1, bun = p;

    if (fs <= nrh && v[h[fs]] < v[h[bun]]) bun = fs;

    if (fd <= nrh && v[h[fd]] < v[h[bun]]) bun = fd;
    if (bun != p)
    {
        schimb(p, bun);
        coboara(bun);
    }
}

void afisare()
{
    for(int i=1;i<=nrh;i++)
        g<<v[h[i]]<<" ";
    g << "\n";
}

int main()
{
    int n, op,x;



    f>>n;

    for(int i=1; i<=n; i++)
    {
        f>>op;
        if(op == 1)
        {
            f>>x;
            v[++nre] = x;
            h[++nrh] = nre;
            poz[h[nrh]] = nrh;
            urca(nrh);
        }
        else if(op == 2)
        {
            f>>x;
            x = poz[x];

            schimb(x, nrh--);

            urca(x);
            coboara(x);
        }
        else g<<v[h[1]]<<'\n';
        //afisare();
    }


    return 0;
}