Cod sursa(job #1785696)

Utilizator dranoellenTurica Leonard-Petru dranoellen Data 21 octombrie 2016 20:11:48
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#define tz 200002
#define mare 1000000001
#include <queue>
using namespace std;

FILE *in=fopen("heapuri.in","r"),*out=fopen("heapuri.out","w");
// trebe ca in heap sa tin minte indexul elem
// trebe ca in val sa tin minte val elem
// trebe ca in index sa tin minte locul lui in heap
int index[tz],val[tz],hip[tz],len,it;
queue <int> space;
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;
    space.push(loc);

}

int main()
{

    int nr,data;
    len=0,it=0,val[0]=mare;
    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;
            if(!space.empty())index[it]=space.front(),space.pop();
            else index[it]=len;
            hip[index[it]]=it;
            add(data);
        }
        else if(data==2)
        {
            fscanf(in,"%d",&data);
            rem(data);
            len--;
        }

    }
    for(int i=1;i<len;++i)
        printf("%d ",val[hip[i]]);
    return 0;
}