Cod sursa(job #2518119)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 4 ianuarie 2020 23:17:15
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
using namespace std;
const int NMAX = 200000;
int poz[NMAX + 5] , n , cnt;
struct heap
{
    int key , ind;
};
heap h[NMAX + 5];
inline void insertheap(int val)
{
    int tata , fiu;
    heap aux;
    n ++;
    cnt ++;
    fiu = n;
    h[n].key = val;
    h[n].ind = cnt;
    poz[cnt] = n;
    while(fiu > 1)
    {
        tata = fiu / 2;
        if(h[fiu].key < h[tata].key)
        {
            poz[h[tata].ind] = fiu;
            poz[h[fiu].ind] = tata;
            aux = h[tata];
            h[tata] = h[fiu];
            h[fiu] = aux;
            fiu = tata;
        }
        else
            break;
    }
}
inline void deleteheap(int ind)
{
    int tata , fiu;
    heap aux;
    tata = poz[ind];
    h[tata] = h[n];
    poz[h[tata].ind] = tata;
    n --;
    while(tata <= n)
    {
        fiu = 2 * tata;
        if(h[fiu].key > h[fiu + 1].key)
            fiu --;
        if(h[tata].key > h[fiu].key)
        {
            poz[h[tata].ind] = fiu;
            poz[h[fiu].ind] = tata;
            aux = h[tata];
            h[tata] = h[fiu];
            h[fiu] = aux;
            tata = fiu;
        }
        else
            break;
    }
}
inline int getmin()
{
    return h[1].key;
}
int main()
{
    freopen("heapuri.in" , "r" , stdin);
    freopen("heapuri.out" , "w" , stdout);
    int m , i , p , x , j;
    scanf("%d" , &m);
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d" , &p);
        if(p == 1)
        {
            scanf("%d" , &x);
            insertheap(x);
        }
        else if(p == 2)
        {
            scanf("%d" , &x);
            deleteheap(x);
        }
        else
            printf("%d\n" , getmin());
    }
    return 0;
}