Cod sursa(job #2111248)

Utilizator DavidLDavid Lauran DavidL Data 21 ianuarie 2018 19:04:03
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#define MAX 200005
using namespace std;
ifstream fi("heapuri.in");
ofstream fo("heapuri.out");

/// poz[i]=pozitia in heap a celui de-al i-lea nr.
/// ord[i]=al catulea nr. e al i-lea din heap
int H[2*MAX],poz[MAX],ord[MAX];
int q,n,nr;

void urca(int x) /// urcam elementul de pe pozitia x
{
    if (x==1)
        return;
    if (H[x]>=H[x/2]) /// >= parinte, e ok
        return;

    /// il schimbam cu parintele
    swap(H[x],H[x/2]);
    swap(poz[ord[x]],poz[ord[x/2]]);
    swap(ord[x],ord[x/2]);

    urca(x/2); /// urcam parintele
}

void coboara(int x) /// coboram elementul de pe pozitia x
{
    int son=0;
    if (2*x<=n) /// are copil stang
    {
        son=2*x;
        if (2*x+1<=n && H[2*x+1]<H[2*x])
            son=2*x+1;
        if (H[son]>=H[x])
            son=0;
    }

    if (son)
    {
        swap(H[x],H[son]);
        swap(poz[ord[x]],poz[ord[son]]);
        swap(ord[x],ord[son]);
        coboara(son);
    }
}

void inserare(int x) /// adaugam elementul x
{
    n++,nr++;
    poz[nr]=n;
    ord[n]=nr;
    H[n]=x;
    urca(n);
}

void stergere(int x) /// stergem al x-lea intrat
{
    int key=poz[x];
    swap(H[key],H[n]);
    n--;
    if (key>1 && H[key]<H[key/2]) /// < parinte, urcam
        urca(key);
    else
        coboara(key);
}

int main()
{
    fi>>q;
    while (q--)
    {
        int c,x;
        fi>>c;
        if (c!=3)
            fi>>x;

        if (c==3)
            fo<<H[1]<<"\n";
        else if (c==1) /// inserare
        {
            inserare(x);
        }
        else /// stergere
        {
            stergere(x);
        }

    }

    return 0;
}