Cod sursa(job #1316643)

Utilizator diana-t95FMI Tudoreanu Diana Elena diana-t95 Data 13 ianuarie 2015 23:09:18
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
using namespace std;
#define maxn 500000
int c=0;
int h[maxn], poz[maxn], val[maxn];
void put(int n)
{
    while (val[h[n/2]]>val[h[n]] && n>1)
    {
        swap(h[n/2], h[n]);
        poz[h[n/2]]=n/2;
        poz[h[n]]=n;
        n=n/2;
    }
}
void take(int n)
{
    if (h[2*n] && h[2*n+1])
    {
        if (val[h[2*n]]>val[h[2*n+1]])
        {
            swap(h[n], h[2*n+1]);
            poz[h[n]]=n;
            poz[h[2*n+1]]=2*n+1;
            take(2*n+1);
        }
        else
        {
           swap(h[n], h[2*n]);
           poz[h[n]]=n;
            poz[h[2*n]]=2*n;
           take(2*n);
        }
    }
    else
    {
        if (h[2*n])
        {
            h[n]=h[2*n];
            poz[h[n]]=n;
            poz[h[2*n]]=2*n;
            h[2*n]=h[c];
            h[c]=0;
            if (2*n!=c) put(2*n);
            else {h[2*n]=0;}
        }
        else
        {
            h[n]=h[c];
            poz[h[n]]=n;
            h[c]=0;
            put(n);
        }
    }

}
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]); c--;}
            if (op==1) {c++; h[c]=c; val[c]=x; poz[c]=c; put(c); }
        }
        //for (j=1;j<=c;j++) cout<<poz[j]<<' ';
        //cout<<endl;
    }

}