Cod sursa(job #677024)

Utilizator ion_calimanUAIC Ion Caliman ion_caliman Data 9 februarie 2012 19:53:52
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

#define swap(a,b) int aux = a; a = b; b = aux;
#define NMAX 200000
#define MAXVAL 1000000000

int N, H[NMAX], nr=0, poz=0, Vpoz[NMAX], Vel[NMAX];

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

void reparaHeap(int p)
{
    int t;
    //reparare dupa o inserare la sfirsit
    if (p==nr){
        while (p>0 && H[p]<H[(p-1)/2]){
            swap(H[p],H[(p-1)/2]);
            p = (p-1)/2;
        }
    } else { //reparare dupa o eliminare
        while ((2*p+1<nr && H[p]>H[2*p+1]) || (2*p+2<nr && H[p]>H[2*p+2])){
            if (2*p+2<nr && H[2*p+1]>H[2*p+2]) t = 2*p+2; else t = 2*p+1;
            swap(H[p],H[t]);
            p = t;
        }
    }
}

void insereaza(int x)
{
    Vel[poz++] = x;
    if (nr==0){
        H[nr++] = x;
    } else {
        H[nr] = x;
        reparaHeap(nr);
        nr++;
    }
}

int cauta(int x)
{
    int i;
    for (i=0; i<nr && H[i]!=x; i++);
    return i;
}

void elimina(int x)
{
    int poz = cauta(Vel[x-1]);
    H[poz] = H[--nr];
    reparaHeap(poz);
}

int main()
{
    int c,x;
    f >> N;
    for (; N--;){
        f >> c;
        if (c==1) { f >> x; insereaza(x); } else
        if (c==2) { f >> x; elimina(x); } else
        if (c==3) { g << H[0] << '\n'; }
    }
}