Cod sursa(job #1610590)

Utilizator roxana.aeleneiAelenei Roxana roxana.aelenei Data 23 februarie 2016 17:34:00
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int const NMAX=200002;
int poz[NMAX], ord[NMAX], h[NMAX],n;

void up(int p)
{
    if(p>1 && h[p]<h[p/2])
    {
        swap(h[p],h[p/2]);
        swap(poz[p],poz[p/2]);
        swap(ord[poz[p]],ord[poz[p/2]]);
        up(p/2);
    }
}

void down(int p)
{
    if(p*2<n)
    {
        if(h[p*2]<h[p*2+1] && h[p]>h[p*2])
        {
            swap(h[p],h[p*2]);
            swap(poz[p],poz[p*2]);
            swap(ord[poz[p]],ord[poz[p*2]]);
            down(p*2);
        }
        if(h[p*2]>=h[p*2+1] && h[p]>h[p*2+1])
        {
            swap(h[p],h[p*2+1]);
            swap(ord[p],ord[p*2+1]);
            swap(poz[ord[p]],poz[ord[p*2+1]]);
            down(p*2+1);
        }
    }
    if(p*2==n && h[p]>h[p*2])
    {
        swap(h[p],h[p*2]);
        swap(poz[p],poz[p*2]);
        swap(ord[poz[p]],ord[poz[p*2]]);
    }
}

int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int t,op, x,cnt=0;
    scanf("%d", &t);
    for(int k=1; k<=t; k++)
    {
        scanf("%d", &op);
        if(op == 1)
        {

            scanf("%d", &x);
            h[++n]=x;
            ++cnt;
            poz[n]=cnt;
            ord[cnt]=n;
            up(n);
        }
        if(op == 2)
        {
            scanf("%d", &x);
            int i=ord[x];
            swap(h[i],h[n]);
            swap(poz[i],poz[n]);
            swap(ord[poz[i]], ord[poz[n]]);
            n--;
            down(i);

        }
        if(op == 3)
        {
            printf("%d\n", h[1]);
        }
    }
    return 0;
}