Cod sursa(job #1444394)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 29 mai 2015 18:29:19
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <vector>
using namespace std;

const int Max = 200005;
int H[Max],Pos[Max],Inx[Max],N,M;

void Insert_Node(int X)
{
    while (X/2 && H[X/2]>H[X])
    {
        swap(Inx[X],Inx[X/2]);
        Pos[Inx[X]] = X;
        Pos[Inx[X/2]] = X/2;
        swap(H[X],H[X/2]);
        X /=2;
    }
}

void Delete_Node(int index)
{
    int Node = Pos[index];
       swap(Inx[Node],Inx[M]);
       Pos[index] = M;
       Pos[Inx[Node]] = Node;
       swap(H[Node],H[M]);
       M--;

    int Son;
    do
    {
        Son = 0;
        if (2*Node <= M) Son = 2*Node;
        if (2*Node + 1 <= M && H[2*Node + 1]<H[Son])
            Son = 2*Node + 1;
        if (H[Node] <= H[Son]) Son = 0;
        if (Son)
        {
            swap(Inx[Node],Inx[Son]);
            Pos[Inx[Node]] = Node;
            Pos[Inx[Son]] = Son;
            swap(H[Node],H[Son]);
        }
        Node = Son;
    }while (Son);
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
     scanf("%d",&N);
     int X;
     char O;

     for (int i = 1;i <= N;i++)
     {
         scanf("%d",&O);
         if (O < 3) scanf("%d",&X);
         switch (O)
         {
             case 1:
                 {
                     M++;
                     H[M] = X;
                     Inx[M] = i;
                     Pos[i] = M;
                     Insert_Node(M);
                     break;
                 }
             case 2:
                 {
                     Delete_Node(X);
                     break;
                 }
             case 3:{ printf("%d\n",H[1]);break;}
         }
     }
    return 0;
}