Cod sursa(job #1918907)

Utilizator KimerthSilviu Motfolea Kimerth Data 9 martie 2017 17:18:45
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAX_NR 200000

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int N, NR;
int H[2 * MAX_NR + 10];
int P[MAX_NR], A[MAX_NR];

int left_son(int nod)
{
    return 2 * nod;
}

int right_son(int nod)
{
    return 2 * nod + 1;
}

int parent(int nod)
{
    return nod / 2;
}

void sift(int K)
{
    int son;
    do
    {
        son = 0;

        if(left_son(K) <= N)
        {
            son = left_son(K);

            if(right_son(K) <= N && A[H[right_son(K)]] < A[H[son]])
                son = right_son(K);
            if(A[H[son]] > A[H[K]])
                son = 0;
        }

        if(son == 0)
            break;

        swap(H[K], H[son]);
        P[H[K]] = K;
        P[H[son]] = son;
        K = son;
    }while(son);
}

void percolate(int K)
{
    while(parent(K) > 0 && A[H[parent(K)]] > A[H[K]])
    {
        swap(H[K], H[parent(K)]);

        P[H[K]] = K;
        P[H[parent(K)]] = parent(K);
        K = parent(K);
    }
}

void insert(int value)
{
    A[++NR] = value;
    H[++N] = NR;
    P[NR] = N;

    percolate(N);
}

void cut(int K)
{
    A[K] = -1;
    percolate(P[K]);
    P[H[1]] = 0;
    H[1] = H[N--];
    P[H[1]] = 1;

    if(N > 1)
        sift(1);
}

int main()
{
    int m;
    fin >> m;
    for(int i = 0; i < m; i++)
    {
        int o, e;
        fin >> o;
        if(o == 3)
            fout << A[H[1]] << '\n';
        else
        {
            fin >> e;

            if(o == 1)
                insert(e);
            else
                cut(e);
        }
    }

    return 0;
}