Cod sursa(job #2474139)

Utilizator SochuDarabaneanu Liviu Eugen Sochu Data 14 octombrie 2019 19:17:04
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define NMAX 200005
#define maxi 1000000001

using namespace std;

ifstream f ("heapuri.in");
ofstream g ("heapuri.out");

int n , x;
int a[NMAX] , poz[NMAX] , poz_heap[NMAX];
short operatie;

int father(int n)
{
    return n / 2;
}

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

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

void Heap_Up(int &k)
{
    int val = a[k];

    while(k > 1 && val < a[father(k)])
    {
        poz_heap[k] = poz_heap[father(k)];
        poz[poz_heap[k]] = k;
        a[k] = a[father(k)];
        k = father(k);
    }

    a[k] = val;
}

void Heap_Down(int k , int n)
{
    int son = 0;

    do
    {
        if(left_son(k) <= n)
        {
            if(right_son(k) <= n && a[right_son(k)] < a[left_son(k)])
                son = right_son(k);
            else son = left_son(k);
        }
        else son = 0;

        if(son)
        {
            poz_heap[k] = poz_heap[son];
            poz[poz_heap[k]] = k;
            swap(a[son] , a[k]);
            k = son;
        }

    }while(son);
}

int main()
{
    int poz_son = 0 , nr = 0;

    f >> n;

    for(int i = 1 ; i <= n ; i++)
    {
        f >> operatie;

        if(operatie == 1)
        {
            f >> x;

            ++nr;
            a[nr] = x;
            int k = nr;

            Heap_Up(k);

            poz[nr] = k;
            poz_heap[k] = nr;
        }
        else if(operatie == 2)
        {
            f >> x;

            a[poz[x]] = maxi;

            Heap_Down(poz[x] , nr);
        }
        else g << a[1] << '\n';
    }

    return 0;
}