Cod sursa(job #1002695)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 28 septembrie 2013 16:04:08
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#define Nmax 200099
#define Father(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int N,n,H[Nmax],v[Nmax],w[Nmax],nr;
bitset <Nmax>Eliminat(0);
void Sift(int H[], int n,int nod)
{
    int Son=0;
    do
    {
        Son=0;
        // Alege un fiu mai mare ca tatal.
        if (LeftSon(nod)<=n)
        {
            Son=LeftSon(nod);
            if( RightSon(nod)<=n && H[RightSon(nod)]<H[LeftSon(nod)] ) Son=RightSon(nod);
            if (H[Son]>=H[nod]) Son=0;
        }
        if (Son)
        {
            int x=w[nod],y=w[Son];
            swap(w[nod],w[Son]);
            v[x]=Son; v[y]=nod;
            swap(H[nod],H[Son]);
            nod=Son;

        }
    } while(Son);
}

inline void Percolate(int H[], int n,int nod)
{
    int key=H[nod],V=v[w[nod]],W=w[nod];
    while (nod>1 && key<H[Father(nod)])
    {
        H[nod]=H[Father(nod)];
        int i=w[Father(nod)];
        v[i]=nod;
        v[nod]=i;
        nod=Father(nod);
    }
    H[nod]=key;
    v[W]=nod;
    w[nod]=V;
}

inline void DeleteHeap(int H[], int &n,int x)
{
    int nod=v[x];
    H[nod]=H[n];
    --n;
    if(nod>1 && H[nod]>H[Father(nod)])Percolate(H,n,nod);
                                else  Sift(H,n,nod);
}

inline void InsertHeap(int H[], int &n,int key)
{
    H[++n]=key;
    nr++;
    v[nr]=n;
    w[n]=nr;
    Percolate(H,n,n);
}

int main()
{
    f>>N;
    for(int i=1;i<=N;i++)
    {
        int tip;
        f>>tip;
        switch (tip)
        {
            case 1:
            {
                int key;
                f>>key;
                InsertHeap(H,n,key);
                //g<<tip<<' '<<key<<':';
                //for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
                break;
            }
            case 2:
            {
                int x;
                f>>x;
                DeleteHeap(H,n,x);
                //g<<tip<<' '<<x<<':';
                //for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
                break;
            }
            case 3:
            {
                g<<H[1]<<'\n';
                //g<<tip<<' '<<':';
                //for(int i=1;i<=n;i++)g<<H[i]<<' '; g<<'\n';g<<'\n';
                break;
            }
            default: break;
        }
    }
    f.close();g.close();
    return 0;
}