Cod sursa(job #1758670)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 17 septembrie 2016 17:13:24
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#define nmax 200005
using namespace std;
unsigned int h[nmax],rh[nmax],d[nmax];
unsigned int n,nou;
void inser(unsigned int x)
{
    unsigned int y;
    n++;nou++;
    y=h[n]=nou;
    rh[nou]=n;
    d[nou]=x;
    while ( (y!=1) && ( d[h[y]] < d[h[y/2]]) )
    {
        swap( rh[h[y]], rh[h[y/2]]);
        swap( h[y], h[y/2]);
        y/=2;
    }
}
void sterg(unsigned int x)
{
    unsigned int y;
    y=rh[x];rh[x]=0;h[y]=0;
    while ( (y<=n) && (h[2*y] || h[2*y+1]) )
    {
        if (h[2*y]&&h[2*y+1])
        {
            if (h[2*y]<h[2*y+1])
            {
                rh[ h[2*y] ]=y;
                swap(h[2*y],h[y]);
                y=2*y;
            }
            else
            {
                rh[ h[2*y+1] ]=y;
                swap(h[2*y+1],h[y]);
                y=2*y+1;
            }
        }
        else
        {
            if (h[2*y])
            {
                rh[ h[2*y] ]=y;
                swap(h[2*y],h[y]);
                y=2*y;
            }
            else
                if (h[2*y+1])
                {
                    rh[ h[2*y+1] ]=y;
                    swap(h[2*y+1],h[y]);
                    y=2*y+1;
                }
        }
    }
    n--;
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    unsigned int m,op,x;
    for (f>>m;m;m--)
    {
        f>>op;
        if (op==3) g<<d[h[1]]<<'\n';
        else
        {
            f>>x;
            if (op==1)
                inser(x);
            else
                sterg(x);
        }
    }
    f.close();
    g.close();
    return 0;
}