Cod sursa(job #1365514)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 28 februarie 2015 12:37:27
Problema Heapuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <utility>
#define MX 200001
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,a[MX];
int total;
int nrint, intrat[MX], poz[MX];

void inserare(int x)
{
    a[++total] = x;
    nrint++;
    poz[x] = total;
    intrat[nrint] = x;

    int tata,act;

    act = total;
    tata = act/2;

    while(a[tata]>a[act] && tata)
    {
        poz[a[tata]] = act;
        poz[a[act]] = tata;
        swap(a[tata], a[act]);
        act = tata;
        tata = act/2;
    }
    a[act] = x;
}

void sterge(int x)
{
    int indice=poz[intrat[x]];

    poz[a[total]] = poz[intrat[x]];
    poz[intrat[x]] = total;
    swap(a[indice], a[total]);
    total--;

    int act=indice,fiu;

    if(act/2 && a[act/2]>a[act])
    {
        while(a[act/2] > a[act] && act/2)
        {
            poz[a[act/2]] = poz[a[act]];
            poz[a[act]] /= 2;
            swap(a[act/2], a[act]);
            act /= 2;
        }
    }
    else
    while(act*2 <= total)
    {
        fiu = 0;
        if(a[act*2]<a[act])
        {
            fiu = act*2;
        }
        if(act*2+1<=total && a[act*2+1]<a[fiu])
        {
            fiu = act*2+1;
        }

        if(!fiu) break;

        poz[a[act]] = poz[a[fiu]];
        poz[a[fiu]] /= 2;
        swap(a[act], a[fiu]);
        act = fiu;
    }

}

int main()
{
    int i,j,x,y;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>x;
        if(x == 1)
        {
            fin>>y;
            inserare(y);
        }
        else
        if(x == 2)
        {
            fin>>y;
            sterge(y);

            /*for(int j=1; j<=total; j++) fout<<a[j]<<' ';
            fout<<'\n';*/
        }
        else
        {
            fout<<a[1]<<'\n';
        }
    }

    fin.close(); fout.close();
    return 0;
}