Cod sursa(job #1623798)

Utilizator rockzoneCerneanu Valentin rockzone Data 1 martie 2016 21:45:43
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int h[200001], ord[200001], poz[200001], l, cnt, n;
void up(int i)
{
    while(i>1 && h[i]<h[i/2])
    {
        swap(h[i], h[i/2]);
        swap(ord[i], ord[i/2]);
        poz[ord[i/2]]=i/2;
        poz[ord[i]]=i;
        i=i/2;
    }
}
void down(int i)
{
    int ind;
    if(i==1)
        if(h[2*i])
            if(h[2*i]<h[i])
            {
                swap(h[i],h[i*2]);
                swap(poz[ord[i]], poz[ord[i*2]]);
                swap(ord[i], ord[i*2]);
            }
    while(i<l-1 && h[i]>min(h[i*2], h[i*2+1]))
    {
        if(h[i*2]<h[i*2+1])
            swap(h[i],h[i*2]);
        else
            swap(h[i],h[i*2+1]);
        if(h[i*2]<=h[i*2+1])
            ind=i*2;
        else
            ind=i*2+1;
        swap(ord[i], ord[ind]);
        poz[ord[ind]]=ind;
        poz[ord[i]]=i;
        i=ind;
    }
}
int main()
{
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "w", stdout);
    int x, i, op, in, ind;
    scanf("%d", &n);
    for(i=1; i<=n; i++)
    {
        scanf("%d", &op);
//        for(in=1; in<=l; in++)
//            printf("%d ", h[in]);
//        printf("\n");
        if(op!=3)
        {
            scanf("%d", &x);
            if(op==1) //adauga
            {
                l++;
                cnt++;
                h[l]=x;
                ord[l]=cnt;
                poz[cnt]=l;
                up(l);

            }
            else //sterge
            {
                if(poz[x]==l)
                {
                    poz[x]=-1;
                    ord[l]=0;
                    h[l]=0;
                    l--;
                }
                else
                {
                    h[poz[x]]=h[l];
                    swap(ord[poz[x]], ord[l]);
                    poz[ord[poz[x]]]=poz[x];
                    ind=poz[x];
                    poz[x]=-1;
                    ord[l]=0;
                    h[l]=0;
                    l--;
                    up(ind);
                    down(ind);
                }
            }
        }
        else
        {
            printf("%d\n", h[1]);
        }
    }

    return 0;
}