Cod sursa(job #1053981)

Utilizator saregardAndrei Tarba saregard Data 13 decembrie 2013 07:52:58
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#define Size 2000000
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int H[Size+1], ord[Size+1], poz[Size+1], n=0, cnt=0;

void urca(int pp)
{
    while(pp>1 && H[ord[pp]]<H[ord[pp/2]])
    {
        swap(ord[pp], ord[pp/2]);
        swap(poz[ord[pp]], poz[ord[pp/2]]);
        pp=pp/2;
    }
}
void coboara(int pp)
{
    int pp2;
    while(pp*2+1<=n &&(H[ord[pp]]>H[ord[pp*2]] || H[ord[pp]]>H[ord[pp*2+1]]))
    {
        pp2=pp*2;
        if(H[ord[pp2]]>H[ord[pp2+1]])
            pp2++;
        swap(ord[pp2], ord[pp]);
        poz[ord[pp2]]=pp2;
        poz[ord[pp]]=pp;
        pp=pp2;
    }
    if(pp*2==n && H[ord[pp]]>H[ord[pp*2]])
    {
        swap(ord[pp], ord[pp*2]);
        swap(poz[ord[pp]], poz[ord[pp*2]]);
    }
}
void inserare()
{
    int x;
    f>>x;
    n++;
    cnt++;
    H[cnt]=x;
    ord[n]=cnt;
    poz[cnt]=n;
    urca(n);
}
void stergere()
{
    int x;
    f>>x;
    ord[poz[x]]=ord[n];
    n--;
    urca(poz[x]);
    coboara(poz[x]);
}
int main()
{
    int N, cod, i, j;
    f>>N;
    for(i=0; i<N; i++)
    {
        f>>cod;
        switch(cod)
        {
        case 1:{inserare(); break;}
        case 2:{stergere(); break;}
        case 3:{g<<H[ord[1]]<<'\n'; break;}
        }
    }
    f.close();
    g.close();
    return 0;
}