Cod sursa(job #1427247)

Utilizator UAIC_HreapcaVlasNegrusUAIC Hreapca Vlas Negrus UAIC_HreapcaVlasNegrus Data 1 mai 2015 19:47:16
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <deque>
#include <vector>
#include <cstring>
#include <bitset>
#include <algorithm>
#include <queue>
#define INF 1<<30
#define uint unsigned int
#define ll long long
using namespace std;

int T, type, i, H[200010], val[200010], pos[200010], cnt, N, x;

void heapUp(int poz)
{
    while(poz > 1)
    {
        if(val[H[poz]] < val[H[poz>>1]])
        {
            pos[H[poz]] = poz>>1;
            pos[H[poz>>1]] = poz;
            swap(H[poz],H[poz>>1]);
            poz = poz >> 1;
        }
        else
            break;
    }
}
void heapDown(int poz)
{
    while(poz + poz <= N)
    {
        if(poz + poz + 1 > N)
        {
            if(val[H[poz]] > val[H[poz + poz]])
            {
                pos[H[poz]] = poz + poz;
                pos[H[poz + poz]] = poz;
                swap(H[poz], H[poz + poz]);
                poz = poz + poz;
                continue;
            }
            else
                break;
        }
        int y = poz + poz;
        if(val[H[y]] > val[H[y+1]])
            y = y + 1;
        if(val[H[poz]] > val[H[y]])
            {
                pos[H[poz]] = y;
                pos[H[y]] = poz;
                swap(H[poz], H[y]);
                poz = y;
                continue;
            }
            else
                break;
    }
}


int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&type);
        if(type == 1)
        {
            scanf("%d",&x);
            val[++cnt] = x;
            H[++N] = cnt;
            pos[cnt] = N;
            heapUp(N);
        }
        if(type == 2)
        {
            scanf("%d",&x);
            pos[H[N]] = pos[x];
            swap(H[N], H[pos[x]]);
            N = N - 1;
            heapUp(pos[x]);
            heapDown(pos[x]);
        }
        if(type == 3)
        {
            printf("%d\n",val[H[1]]);
        }
    }
    return 0;
}