Cod sursa(job #1043451)

Utilizator OnimushaLordTiberiu Copaciu OnimushaLord Data 28 noiembrie 2013 17:01:39
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
# include <cstdio>
# define MAXN 500001

using namespace std;
int a[MAXN],H[MAXN],poz[MAXN],i,n,op,nr,k,k1;

void swap(int x,int y)
{
    int aux;
    aux=H[x];
    H[x]=H[y];
    H[y]=aux;
    poz[H[x]]=x;
    poz[H[y]]=y;
}
void HeapUp(int k)
{
    int t;
    if(k<=1) return;
    t=k/2;
    if(a[H[k]]<a[H[t]])
    {
        swap(k,t);
        HeapUp(t);
    }
}
void HeapDown(int p, int k)
{
    int i,Dr,St;
    if(2*p<=k)
    {
        St=a[H[2*p]];
        if(2*p+1<=k) Dr=a[H[2*p+1]];
        else Dr=St+1;
        if(St<Dr) i=2*p;
        else i=2*p+1;
        if(a[H[p]]>a[H[i]])
        {
            swap(p,i);
            HeapDown(i,k);
        }
    }
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    scanf("%d", &n);
    for(i=1; i<=n; ++i)
    {
        scanf("%d" , &op);
        if(op==1 || op==2) scanf("%d", &nr);
        if(op==1)
        {
            a[++k]=nr;
            H[++k1]=k;
            poz[k]=k1;
            HeapUp(k1);
        }
        if(op==2)
        {
            int x=poz[nr];
            swap(poz[nr],k1);
            k1--;
            HeapDown(x,k1);
        }
        if(op==3) printf("%d\n", a[H[1]]);
    }
}