Cod sursa(job #1092953)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 27 ianuarie 2014 16:50:27
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <algorithm>
#include <queue>
#define Nmax 200099
#define T(i) i/2
#define L(i) 2*i
#define R(i) 2*i+1
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");

int N,keys,H[Nmax],v[Nmax],w[Nmax],nr;
//nr va reprezenta cate chei au fost introduse
//cand o cheie dispare e nu se modifica!
//v[i]= nodul care a intrat al i-lea in ordine cronologica
//w[nod]= pe ce pozitie cronologica a intrat nodul nod



inline void Insert(int x),Delete(int x),Down(int nod),Up(int nod),Swap(int x,int y);


int main()
{
    f>>N;
    for(int i=1;i<=N;++i)
    {
        int tip;
        f>>tip;
        if(tip==1)
        {
            int x;
            f>>x;
            Insert(x);
        }
        else
            if(tip==2)
            {
                int x;
                f>>x;
                Delete(x);
            }
            else g<<H[1]<<'\n';

    }
    f.close();g.close();
    return 0;
}

inline void Insert(int x)
{
    H[++N]=x;
    v[++nr]=N;
    w[N]=nr;
    Up(N);
}

inline void Delete(int x)
{
    int nod=v[x];
    Swap(v[x],N);
    --N;
    Up(nod);
    Down(nod);
}

inline void Down(int nod)
{
    int son;
    do
    {
        son=0;
        if (L(nod)<=N)
        {
            son=L(nod);
            if( R(nod)<=N && H[R(nod)]>H[L(nod)] ) son=R(nod);
            if (H[son]>=H[nod]) son=0;
        }
        if (son)
        {
            Swap(nod,son);
            nod=son;
        }
    } while(son);
}

inline void Up(int nod)
{
    int x=H[nod];
    while (nod>1 && x<H[T(nod)])
    {
        Swap(nod,T(nod));
        nod=T(nod);
    }
    H[nod]=x;
}

inline void Swap(int x,int y)
{
    swap(w[x],w[y]);
    v[w[x]]=x;
    v[w[y]]=y;
    swap(H[x],H[y]);
}