Cod sursa(job #1339575)

Utilizator cremarencodianaCremarenco Diana cremarencodiana Data 10 februarie 2015 23:28:46
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>

using namespace std;

int a[200010], k,op,x,i,j,n,m,b[200010],lg;
void fixUp(int a[200010], int k)
{
    int aux;
    while (k>1 && a[k/2]>a[k])
    {
        aux=a[k/2];
        a[k/2]=a[k];
        a[k]=aux;
        k=k/2;
    }
}

void fixDown(int a[200010], int k, int m)
{
    int j, aux;
    while (2*k<=m)
    {
        j=2*k;
        if (j+1<=m && a[j+1]<a[j]) j++;
        if (a[k]<=a[j]) break;
        aux=a[k]; a[k]=a[j]; a[j]=aux;
        k=j;
    }
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d\n",&n); m=0;
    for (i=1; i<=n; i++)
    {
        scanf("%d ",&op);
        if (op==1)
        {
            scanf("%d\n",&x);
            m++;
            a[m]=x;
            fixUp(a,m);
            b[++lg]=x;
        }
        if (op==2)
        {
            scanf("%d\n",&x);
            for (k=1; k<=m; k++)
                if (a[k]==b[x]) break;
            a[k]=a[m]; m--;
            fixDown(a,k,m);
        }
        if (op==3)
        {
            printf("%d\n",a[1]);
        }
    }

    return 0;
}