Cod sursa(job #1169523)

Utilizator AlisRinja Alis Alis Data 11 aprilie 2014 16:39:21
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int MAXN=200005;
int M,N,v;
int Heap[MAXN], Pos[MAXN],V[MAXN];
inline int leftSon(int k)
{
    return 2*k;
}
inline int rightSon(int k)
{
    return 2*k+1;
}
inline int Father(int k)
{
    return k/2;
}
inline int Query()
{
    return V[Heap[1]];
}
inline void Percolate(int k)
{
    while(k>1 && V[Heap[k]]<V[Heap[Father(k)]])
    {
     swap(Heap[Father(k)],Heap[k]);
     Pos[Heap[k]]=k;
     Pos[Heap[Father(k)]]=Father(k);
    }

}
inline void Sift(int k)
{
    int son;
    do
    {
        son=0;
        if(leftSon(k)<=N)
        {

          son=leftSon(k);
        if(rightSon(k)<=N&&V[Heap[son]]>V[Heap[rightSon(k)]])
            son=rightSon(k);
        if(V[Heap[k]]<=V[Heap[son]]) son=0;
        }
        if(son)
        {
            swap(Heap[son],Heap[k]);
            Pos[Heap[son]]=son;
            Pos[Heap[k]]=k;
            k=son;
        }

    }
    while(son);

}
inline void Erase(int k) //Stergere element
{
        Heap[Pos[k]]=Heap[N];
        N-=1;
        Percolate(Pos[k]);
        Sift(Pos[k]);
}
inline void Insert(int x) //Adaugare element
{
        V[++v]=x;
        Heap[++N]=v;
        Pos[v]=N;
        Percolate(N);
}
int main()
{
    fin>>M;
    for(int i=1;i<=M;i++)
    {
        int op,x;
        fin>>op;
        if(op==1)
        {
            fin>>x;
            Insert(x);
        }
        if(op==2)
        {
            fin>>x;
            Erase(x);
        }
        if(op==3)
            fout<<Query()<<'\n';
    }
    return 0;
}