Cod sursa(job #1817383)

Utilizator crazylamaRiclea Andrei crazylama Data 27 noiembrie 2016 18:36:57
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <fstream>
#include <utility>
#include <vector>
#define NMAX 200001
using namespace std;

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

vector< pair<int, int> > v(NMAX);
vector<int> poz(NMAX);

int nrOfInsertions;

void InsertNode(int &nrOfNodes, int key)
{
    v[++nrOfNodes].first = key;
    v[nrOfNodes].second = ++nrOfInsertions;
    poz[nrOfInsertions] = nrOfNodes;
    int son = nrOfNodes, father = nrOfNodes / 2;
    while (son > 1 && v[father].first > v[son].first)
    {
        swap(v[father], v[son]);
        swap(poz[v[father].second], poz[v[son].second]);
        son = father;
        father = son / 2;
    }
}

void DeleteNode(int &nrOfNodes, int pozErased)
{
    v[poz[pozErased]] = v[nrOfNodes];
    poz[v[nrOfNodes].second] = poz[pozErased];
    --nrOfNodes;
    int node = poz[pozErased];
    int father = node / 2;
    while (node > 1 && v[father].first > v[node].first)
    {
        swap(v[node], v[father]);
        swap(poz[v[node].second], poz[v[father].second]);
        node = father;
        father = node / 2;
    }
    int son = 0;
    do
    {
        if (2 * node <= nrOfNodes)
            son = 2 * node;
        if (son + 1 <= nrOfNodes && v[son].first > v[son + 1].first)
            son = son + 1;
        if (v[son].first >= v[node].first)
            son = 0;
        if (son)
        {
            swap(v[son], v[node]);
            swap(poz[v[son].second], poz[v[node].second]);
            node = son;
        }
    } while (son);
}

int main()
{
    int n, p, x, nr = 0;
    f >> n;
    for (int i = 1; i <= n; ++i)
    {
        f >> p;
        if (p == 1)
        {
            f >> x;
            InsertNode(nr, x);
        }
        else if (p == 2)
        {
            f >> x;
            DeleteNode(nr, x);
        }
        else
            g << v[1].first << "\n";
    }
    return 0;
}