Cod sursa(job #1785703)

Utilizator dranoellenTurica Leonard-Petru dranoellen Data 21 octombrie 2016 20:20:55
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#define tz 200002
using namespace std;

FILE *in=fopen("heapuri.in","r"),*out=fopen("heapuri.out","w");

int index[tz],val[tz],hip[tz],len,it;

void add(int number)
{
    int loc=len,aux;
    while(loc>1&&val[hip[loc]]<val[hip[loc/2]])
    {

        aux=index[hip[loc]];
        index[hip[loc]]=index[hip[loc/2]];
        index[hip[loc/2]]=aux;

        aux=hip[loc];
        hip[loc]=hip[loc/2];
        hip[loc/2]=aux;
        loc/=2;

    }
}

void rem(int ind)
{
    int loc=index[ind];
    while(loc*2+1<=len)
    {
        if(val[hip[loc*2]]<val[hip[loc*2+1]])loc*=2;
        else loc=loc*2+1;
        hip[loc/2]=hip[loc];
        index[hip[loc]]=loc/2;

    }
    if(loc*2==len)
        loc*=2,
        hip[loc/2]=hip[loc],
        index[hip[loc]]=loc/2;
    hip[loc]=0;

}

int main()
{

    int nr,data;
    len=0,it=0,val[0]=1000000001;
    for(fscanf (in,"%d",&nr);nr;--nr)
    {
        fscanf(in,"%d",&data);
        if(data==3)
            fprintf(out,"%d\n",val[hip[1]]);
        else if(data==1)
        {
            ++len,++it;
            fscanf(in,"%d",&data);
            val[it]=data;
                index[it]=len;
            hip[index[it]]=it;
            add(data);
        }
        else if(data==2)
        {
            fscanf(in,"%d",&data);
            rem(data);
            len--;
        }

    }

    return 0;
}