Cod sursa(job #1288287)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 8 decembrie 2014 18:50:59
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;

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

const int nmax = 200000;
int h[nmax + 1] , v[nmax + 1] , poz[nmax + 1];
int n , nh;

void schimba(int i1 , int i2)
{
    int aux = h[i1];

    poz[h[i1]] = i2;
    poz[h[i2]] = i1;

    h[i1] = h[i2];
    h[i2] = aux;
}

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

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

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

    if(fd <= nh && v[h[fd]] < v[h[i]])
        bun = fd;

    if(bun != i)
    {
        schimba(i , bun);
        coboara(bun);
    }
}

int main()
{
    in >> n;

    int op , elem;
    nh = 0;
    for(int i = 1 ; i <= n ; i++)
    {
        in >> op;

        if(op == 1)
        {
            in >> v[++nh];
            h[nh] = nh;
            poz[h[nh]] = nh;

            urca(nh);
            coboara(nh);
        }
        else if(op == 2)
        {
            in >> elem;
            elem = poz[elem];

            schimba(elem , nh--);
            urca(elem);
            coboara(elem);
        }
        else
            out << v[h[1]] << '\n';
    }
    return 0;
}