Cod sursa(job #749800)

Utilizator thea35Mihai Ana thea35 Data 18 mai 2012 20:17:52
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>

using namespace std;

int k, h[1000001], poz[1000001], nh, nr, v[1000001];

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

void scrie ()
{
    out << "heapul: ";
    for(int i=1 ; i<=nh ; i++)
        out << v[h[i]] << " " ;
    out << "\n";
}

void schimb (int a, int b)
{
    int aux;
    aux=h[a];
    h[a]=h[b];
    h[b]=aux;
    poz[h[a]] = a;
    poz[h[b]] = b;
}

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

void down (int p)
{
    int fs=2*p, fd=2*p+1, pmin=p;
    if(fs<=nh && v[h[fs]]<v[h[pmin]])
        pmin=fs;
    if(fd<=nh && v[h[fd]]<v[h[pmin]])
        pmin=fd;
    if(p!=pmin)
    {
        schimb (p, pmin);
        down(pmin);
    }
}

int main()
{
    int N, i, op, x, m;
    in>>N;
    for(i=1 ; i<=N ; i++)
    {
        in >> op;
        if(op==3)
        {
            out << v[h[1]] << "\n";
            continue;
        }
        in >> x;
        if(op == 1)
        {
            v[++nr] = x;
            h[++nh] = nr;
            poz[nr] = nh;
            up(nh);
        }
        else
        {
            m = poz[x];
            schimb(poz[x],nh--);
            down(m);
        }
        //scrie();
    }

    return 0;
}