Cod sursa(job #1319405)

Utilizator diana-t95FMI Tudoreanu Diana Elena diana-t95 Data 16 ianuarie 2015 22:30:10
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
using namespace std;
#define maxn 500000
int valc=0, hc=0;
int h[maxn], poz[maxn], val[maxn];
int getmin(int n)
{
    if (h[2*n+1] && h[2*n])
        if (val[h[2*n]]>val[h[2*n+1]]) return 2*n+1;
            else return 2*n;
    if (h[2*n]) return 2*n;
    return 0;

}
void up(int n)
{
    while (val[h[n/2]]>val[h[n]] && n>1)
    {
        swap(h[n/2], h[n]);
        swap(poz[h[n/2]], poz[h[n]]);
        n=n/2;
    }
}
void down(int n)
{
    int m=getmin(n);
    while (m)
    {
        if (val[h[n]]>val[h[m]])
        {
            swap(h[n], h[m]);
            swap(poz[h[n]], poz[h[m]]);
            n=m;
            m=getmin(n);
        }
        else return;
    }

    //swap(poz[h[n]], poz[h[m]]);
    //poz[h[m]]=m;
}
void take(int n)
{
    h[n]=h[hc];
    h[hc]=0;
    hc--;
    if ((n>1) && val[h[n]]<val[h[n/2]])
        up(n);
    else down(n);
    //poz[h[n]]=0;
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    int n, op, x, i, j;
    f>>n;

    for (i=1;i<=n;i++)
    {
        f>>op;
        if (op==3) g<<val[h[1]]<<'\n';
        else
        {
            f>>x;
            if (op==2) take(poz[x]);
            if (op==1)
            {
                hc++; valc++;
                h[hc]=valc; val[valc]=x;
                poz[hc]=hc;
                up(hc);
            }
        }
    }

}