Cod sursa(job #1403485)

Utilizator rockerboyHutter Vince rockerboy Data 27 martie 2015 12:28:27
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <climits>
#include <vector>
#include <algorithm>

std::ifstream be("heapuri.in");
std::ofstream ki("heapuri.out");

struct tipus
{
    int ertek, sorszam;
};

std::vector<tipus> kupac;
std::vector<int> poz;
int aktsorszam;

void fel (int p)
{
    while (kupac[p/2].ertek > kupac[p].ertek) {
        std::swap (kupac[p/2], kupac[p]);
        poz[kupac[p/2].sorszam] = p/2;
        poz[kupac[p].sorszam] = p;
        p /= 2;
    }
}

void le (int p)
{
    int min1;
    while (p*2 <= kupac.size()-1) {
        if (p*2+1 > kupac.size()-1) min1 = p*2;
        else min1 = kupac[p*2].ertek < kupac[p*2+1].ertek ? p*2 : p*2+1;
        if (kupac[p].ertek > kupac[min1].ertek) {
            std::swap (kupac[p], kupac[min1]);
            poz[kupac[p].sorszam] = p;
            poz[kupac[min1].sorszam] = min1;
            p = min1;
        }
        else break;
    }
}

void betesz_kupac (tipus x)
{
    kupac.push_back (x);
    poz.push_back (x.sorszam);
    fel (kupac.size()-1);
}

void kivesz_kupac (int p)
{
    kupac[p] = kupac.back();
    poz[kupac[p].sorszam] = p;
    kupac.pop_back();

    le (p);
}

int main()
{
    tipus tmp;
    int n, i, op1, op2;

    tmp.ertek = INT_MIN;
    tmp.sorszam = 0;
    aktsorszam = 0;

    kupac.push_back (tmp);
    poz.push_back (0);

    be >> n;

    for (i=1; i<=n; i++) {
        be >> op1;
        if (op1 == 1) {
            be >> op2;
            aktsorszam++;
            tmp.sorszam = aktsorszam;
            tmp.ertek = op2;
            betesz_kupac (tmp);
        }
        else if (op1 == 2) {
            be >> op2;
            kivesz_kupac (poz[op2]);
        }
        else if (op1 == 3) {
            ki << kupac[1].ertek << "\n";
        }
    }
}