Cod sursa(job #1785743)

Utilizator dranoellenTurica Leonard-Petru dranoellen Data 21 octombrie 2016 21:10:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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 upward(int number)
{
    int loc=number,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 downward(int a)
{

    int aux,b=0;
    while(b!=a)
    {
        b=a;
        if(b*2+1<=len&&val[hip[a]]>val[hip[b*2+1]])a=b*2+1;
        if(b*2<=len&&val[hip[a]]>val[hip[b*2]])a=b*2;
        aux=hip[a],
        hip[a]=hip[b],
        hip[b]=aux,
        index[hip[b]]=b,
        index[hip[a]]=a;
    }

}

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==1)
            ++len,++it,
            fscanf(in,"%d",&data),
            val[it]=data,
            index[it]=len,
            hip[index[it]]=it,
            upward(len);
        else if(data==2)
            fscanf(in,"%d",&data),
            val[data]=-1,
            upward(index[data]),
            hip[1]=hip[len],
            index[hip[1]]=1,
            len--,
            downward(1);
        else if(data==3)
            fprintf(out,"%d\n",val[hip[1]]);

    }
    return 0;
}