Cod sursa(job #1739582)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 9 august 2016 19:27:29
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int maxn = 200005;
struct pereche
{
    int val, p;
};
pereche v[maxn];
int pozitii[maxn];
int n, cnt;

void up(int poz)
{
    if(poz / 2 == 0)
        return;
    if(v[poz].val < v[poz / 2].val)
    {
        pozitii[v[poz].p] = poz / 2;
        pozitii[v[poz / 2].p] = poz;
        swap(v[poz], v[poz / 2]);
        up(poz / 2);
    }
    return;
}

void add(int x)
{
    v[++n].val = x;
    v[n].p = cnt;
    pozitii[cnt] = n;
    up(n);
}

void down(int poz)
{
    int next = poz * 2;
    if(next > n)
        return;
    if(next < n && v[next].val > v[next + 1].val)
        next++;
    if(next <= n && v[poz].val > v[next].val)
    {
        pozitii[v[poz].p] = next;
        pozitii[v[next].p] = poz;
        swap(v[poz], v[next]);
        down(next);
    }
    return;
}

void sterge(int pos)
{
    int poz = pozitii[pos];
    swap(pozitii[v[n].p], pozitii[pos]);
    swap(v[n], v[poz]);
    n--;
    up(poz);
    down(poz);
}

int main()
{
    int nrop;
    in >> nrop;
    int x;
    for(int l = 1; l <= nrop; l++)
    {
        int op;
        in >> op;
        if(op == 1)
        {
            cnt++;
            in >> x;
            add(x);
        }
        else if(op == 2)
        {
            in >> x;
            sterge(x);
        }
        else
            out << v[1].val << "\n";
    }
    return 0;
}