Cod sursa(job #1452689)

Utilizator NicusorTelescu Nicolae Nicusor Data 21 iunie 2015 17:20:46
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <cstdio>

using namespace std;

int heap[200001],nr_noduri=0,poz_x[200001],x1=0,x_poz[200001];

void schimbare(int &a,int &b);

void operatia1(int heap1[],int &n)
{
    int x;
    scanf("%d ",&x);
    x1++;
    heap1[++n]=x;
    poz_x[n]=x1;
    x_poz[x1]=n;
    int ok=1,k=n;
    while (ok)
    {
        if (k/2 >= 1 && heap1[k] < heap1[k/2])
        {
            schimbare(heap1[k],heap1[k/2]);
            schimbare(x_poz[x1],x_poz[poz_x[k/2]]);
            schimbare(poz_x[k],poz_x[k/2]);
            k/=2;
        }
        else ok=0;
    }
}

void operatia2(int heap1[],int &n)
{
    int x;
    scanf("%d ",&x);

    heap1[x_poz[x]]=1000000001;

    int k=x_poz[x];

    schimbare(heap1[k],heap1[n]);
    schimbare(poz_x[n],poz_x[k]);
    schimbare(x_poz[poz_x[k]],x_poz[x]);

    n--;

    int ok=1;

    while (ok)
    {
        int min1=heap1[k],min2=k;
        if (k*2+1<=n)
        {
            if (heap1[k*2 + 1] < heap1[k])
            {
                schimbare(heap1[k*2+1],heap1[k]);
                schimbare(poz_x[k],poz_x[k*2+1]);
                schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2+1]]);
                k=k*2+1;
            }
            else
                if (heap1[k*2] < heap1[k])
                {
                    schimbare(heap1[k*2],heap1[k]);
                    schimbare(poz_x[k],poz_x[k*2]);
                    schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2]]);
                    k=k*2;
                }
        }
        else
            if (k*2<=n)
            {
                if (heap1[k*2] < heap1[k])
                {
                    schimbare(heap1[k*2],heap1[k]);
                    schimbare(poz_x[k],poz_x[k*2]);
                    schimbare(x_poz[poz_x[k]],x_poz[poz_x[k*2]]);
                    k=k*2;
                }
            }
        if (min2==k) ok=0;
    }
}

void operatia3(int heap1[],int &n)
{
    printf("%d\n",heap1[1]);
}

void schimbare(int &a,int &b)
{
    int c=a;
    a=b;
    b=c;
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n;
    scanf("%d ",&n);
    for (int i=1;i<=n;i++)
    {
        int a,b;
        scanf("%d ",&a);
        if (a==1)
            operatia1(heap,nr_noduri);
        if (a==2)
            operatia2(heap,nr_noduri);
        if (a==3)
            operatia3(heap,nr_noduri);
    }
}