Cod sursa(job #1601580)

Utilizator rockzoneCerneanu Valentin rockzone Data 15 februarie 2016 23:59:51
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200012], n, ins[200010], poz[200010], nr, lung, cnt;
void adauga(int x)
{
    int ind=lung;
    while(ind>1)
    {
        if(h[ind]<h[ind/2])
        {
            swap(poz[h[ind/2]], poz[h[ind]]);
            swap(h[ind], h[ind/2]);

        }
            //swap(ins[ind],ins[ind/2]);
            ind=ind/2;
    }
}
void pop(int x)
{
    int ind=poz[x];
    while(ind<lung)
    {
        if(h[2*ind]<h[2*ind+1])
        {
            if(h[2*ind])
            {
                swap(poz[h[ind]], poz[h[2*ind]]);
                swap(h[ind], h[2*ind]);
                ind=2*ind;
            }
            else
            {
                swap(h[ind], h[2*ind+1]);
                swap(poz[h[ind]], poz[h[2*ind+1]]);
                ind=2*ind+1;
            }
        }
        else
        {
            if(h[2*ind+1])
            {
                swap(poz[h[ind]], poz[h[ind+1]]);
                swap(h[ind], h[2*ind+1]);
                ind=2*ind+1;
            }
            else
            {
                swap(h[ind], h[2*ind]);
                swap(poz[h[ind]], poz[h[2*ind]]);
                ind=2*ind;
            }

        }
    }
    poz[h[ind]]=0;
    h[ind]=0;
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int x, o, i, k;
    scanf("%d", &n);
    for(i=1; i<=n; i++)
    {
        scanf("%d", &o);
        if(o!=3)
        {
            scanf("%d", &x);
            if(o==1)
            {
                lung++; //crestem lungimea heap-ului
                cnt++; // al catelea el introdus
                ins[cnt]=x; //toate el introduse in ord cronologica
                poz[x]=lung; //poz lui x in heap
                h[lung]=x; // il punem pe x la sf heapului
                adauga(x);

            }
            else
            {
                pop(ins[x]);
                lung--;

            }
        }
        else
        {
            printf("%d\n", h[1]);
        }
    }

    return 0;
}