Cod sursa(job #1292754)

Utilizator axelteoTeodor Dutu axelteo Data 14 decembrie 2014 19:04:45
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
using namespace std;
struct Heap
{
    int nr,ord;
}heap[200001],aux;
int poz[200001];
int main()
{
    FILE *in,*out;
    in=fopen("heapuri.in","r");
    out=fopen("heapuri.out","w");
    int n,i,l=0,op,pos,a,x,place=0;
    fscanf(in,"%d",&n);
    for(i=1;i<=n;++i)
    {
        fscanf(in,"%d",&op);
        if(op==1)
        {
            fscanf(in,"%d",&heap[++l].nr);
            heap[l].ord=++place;
            poz[heap[l].ord]=l;
            pos=l;
            while(pos/2&&heap[pos].nr<heap[pos/2].nr)
            {
                poz[heap[pos].ord]/=2;
                poz[heap[pos/2].ord]*=2;
                aux=heap[pos];
                heap[pos]=heap[pos/2];
                heap[pos/2]=aux;
                pos/=2;
            }
        }
        if(op==2)
        {
            fscanf(in,"%d",&pos);
            heap[poz[pos]]=heap[l];
            if(heap[l].nr<heap[l-1].nr)heap[poz[pos]]=heap[l];
            heap[l].nr=0;
            heap[l].ord=0;
            --l;
            x=poz[pos];
            while(x*2<=l&&(heap[x].nr>heap[x*2].nr||heap[x].nr>heap[x*2+1].nr))
            {
                if((heap[x*2].nr<heap[x*2+1].nr)||heap[2*x+1].nr==0)
                {
                    aux=heap[x*2];
                    pos*=2;
                }
                else
                {
                    aux=heap[x*2+1];
                    pos=pos*2+1;
                }
                heap[pos]=heap[x];
                heap[x]=aux;
                a=poz[heap[x].ord];
                poz[heap[x].ord]=poz[heap[pos].ord];
                poz[heap[pos].ord]=a;
                x=poz[pos];
            }
        }
        if(op==3)fprintf(out,"%d\n",heap[1].nr);
    }
    fclose(in);fclose(out);
    return 0;
}