Cod sursa(job #1041316)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 25 noiembrie 2013 18:57:59
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

using namespace std;

int A[200001], H[200001], poz[200001], M, N, i, x, j, d;

inline void swap(int i, int j)
{
    int x;
    x=H[i],H[i]=H[j],H[j]=x;
    x=poz[H[i]],poz[H[i]]=poz[H[j]],poz[H[j]]=x;
}

inline void HeapUp(int i)
{
    if (i==1) return;
    if (A[H[i]]<A[H[i/2]]) {swap(i, i/2);HeapUp(i/2);}
}

inline void HeapDown(int i)
{
    int st,dr;
    if (i*2>M) return;
    st=i*2;
    if (i*2+1>M) dr=st+1; else dr=i*2+1;
    if (st<dr)
    {
        swap(i, i*2);
        HeapDown(i*2);
    }
    else
    {
        swap(i, i*2+1);
        HeapDown(i*2+1);
    }
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &N);
    H[0]=-1;
    for (i=1; i<=N; i++)
    {
        scanf("%d",&j);
        if (j!=3) scanf("%d", &x);
        if (j==1)
        {
            A[++M]=x;
            H[M]=M;
            poz[M]=M;
            HeapUp(M);
        }else
        if (j==2)
        {
            d=poz[x];
            swap(poz[x], M);
            M--;
            if (A[H[d]]<A[H[d/2]] ) HeapUp(d); else HeapDown(d);
        }else printf("%d\n", A[H[1]]);
    }
    return 0;
}