Cod sursa(job #1763867)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 24 septembrie 2016 18:27:59
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#define nmax 200005
using namespace std;
unsigned int h[nmax],rh[nmax],n;
int d[nmax];
void inser(unsigned int x)
{
    while ( (x!=1) && ( d[h[x]] < d[h[x/2]]) )
    {
        swap( h[x], h[x/2]);
        rh[h[x]]=x;
        rh[h[x/2]]=x/2;
        x/=2;
    }
}
void sterg(unsigned int x)
{
    unsigned int y=0;
    while (x!=y)
    {
        y=x;
        if ( (y*2<=n) && (d[h[x]]>d[h[2*y]]) ) x=2*y;
        //daca y are fiu in stanga si e mai mic ca el
        if ( (y*2+1<=n) && (d[h[x]]>d[h[2*y+1]]) ) x=2*y+1;
        //daca y are fiu in dreapta si e mai mic ca el
        swap(h[x],h[y]);
        rh[h[x]]=x;
        rh[h[y]]=y;
    }
}
int main()
{
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    unsigned int m,op,x,nou=0;
    for (f>>m;m;m--)
    {
        f>>op;
        if (op==3) g<<d[h[1]]<<'\n';
        else
        {
            f>>x;
            if (op==1)
                {
                    n++,nou++;
                    d[nou]=x;
                    h[n]=nou;
                    rh[nou]=n;
                    inser(n);
                }
            else
                {
                    d[x]=-1;
                    inser(rh[x]);
                    //aducem in varf elementul sters
                    rh[h[1]]=0;
                    //stergem elementul din rh
                    h[1]=h[n];
                    rh[h[1]]=1;
                    //aducem ultimul element in varf
                    n--;
                    if (n>1) sterg(1);
                    //daca mai avem elemente in heap, il echilibram
                }
        }
    }
    f.close();
    g.close();
    return 0;
}