Cod sursa(job #1181320)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 2 mai 2014 14:46:32
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#define MX 200001
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n;
int p[MX],np;
int d[MX],t,poz[MX];    //poz[i] = pozitia nodului i in heap

void reconstituie(int i)
{
    int minim,aux;
    minim = i;

    if(2*i <= np)
    {
        if(d[p[2*i]] < d[p[i]]) minim = 2*i;
    }
    if(2*i+1 <= np)
    {
        if(d[p[2*i+1]] < d[p[minim]]) minim = 2*i+1;
    }

    if(minim != i)
    {
        aux = p[i];
        p[i] = p[minim];
        p[minim] = aux;

        poz[p[i]] = i;
        poz[p[minim]] = minim;
        reconstituie(minim);
    }
}

int TOP()
{
    return d[p[1]];
}

void PUSH(int x)    //adauga un element cu valoarea x in heap
{
    np++;
    t++;
    d[t] = x;
    int mp=np;
    while(mp>1 && d[p[mp/2]]>x)
    {
        p[mp] = p[mp/2];
        poz[p[mp]] = mp;
        mp /= 2;
    }
    p[mp] = t;
    poz[p[mp]] = mp;
}

void POP(int i)  //modificat sa poata scoata un termen de pe orice pozitie
{
    int aux;
    aux = poz[i];

    poz[i] = np;
    p[aux] = p[np];
    poz[p[aux]] = aux;
    np--;
    reconstituie(aux);
}

int main()
{
    int i,o,x;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>o;
        switch(o)
        {
            case 1:
                {
                    fin>>x;
                    PUSH(x);
                }
                break;
            case 2:
                {
                    fin>>x;
                    POP(x);
                }
                break;
            case 3: fout<<TOP()<<'\n'; break;
        }
    }

    fin.close(); fout.close();
    return 0;
}