Cod sursa(job #1805874)

Utilizator stefii_predaStefania Preda stefii_preda Data 14 noiembrie 2016 16:13:55
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#define N 200005

using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");

struct heap
{
    int val, ind;
};

heap h[N];

int poz[N];
int n, k;

void up (int p)
{
    if(p > 1 && h[p].val < h[p/2].val)
    {
        swap(h[p], h[p/2]);
        swap(poz[h[p].ind], poz[h[p/2].ind]);
        up(p/2);
    }

}

void down(int p)
{
    if(2*p <= k)
    {
        int x = p;
        if(h[2*p].val < h[x].val)
            x = 2*p;
        if(2*p + 1 <= k && h[2*p + 1].val < h[x].val)
            x = 2*p + 1;
        if(x != p)
        {
            swap(h[p], h[x]);
            swap(poz[h[p].ind], poz[h[x].ind]);
            down(x);
        }

    }

}

int main()
{
    in >> n;
    int i, cod, x, cnt = 0;
    for(i = 1; i <= n; i++)
    {
        in >> cod;
        if(cod == 3)
            out << h[1].val << "\n";
        else
        {
            in >> x;
            if(cod == 1)
            {
                cnt++;
                k++;
                h[k].val = x;
                h[k].ind = cnt;
                poz[cnt] = k;
                up(k);
            }
            else
            {
                int w = poz[x];
                h[w] = h[k];
                poz[h[k].ind] = w;
                k--;
                up(w);
                down(w);
            }
        }
    }

}