Cod sursa(job #1620531)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 29 februarie 2016 10:36:27
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include <vector>

using namespace std;

#define dim 200010
#define DBG 0
#define INF 2000000000

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

int Pos[dim],Arb[4*dim],i,j,n,m,q,p,x,y,val,removePos,addPos;

void _Add(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] = val;
        Pos[ addPos ] = nod;
        return;
    }

    int middle = ( left + right ) / 2;

    if( addPos <= middle )
        _Add( 2 * nod , left , middle );
    else
        _Add( 2 * nod + 1 , middle + 1 , right);

    Arb[ nod ] = min( Arb[ 2 * nod ] , Arb[ 2 * nod + 1] );
}
/*
void _Remove(int nod, int left, int right)
{
    if( left == right )
    {
        Arb[ nod ] = INF;
        return;
    }

    int middle = ( left + right ) / 2;

    if( removePos <= middle )
        _Remove( 2 * nod , left , middle );
    else
        _Remove( 2 * nod + 1 , middle + 1 , right );

    Arb[ nod ] = min( Arb[ 2 * nod ] , Arb[ 2 * nod + 1 ] );
}
*/

void _Remove( int nod )
{
    if( nod == removePos )
    {
        Arb[ nod ] = INF;
    }

    Arb[ nod ] = min( Arb[ 2 * nod ] , Arb[ 2 * nod + 1 ] );

    if( nod == 1 )
    {
        return;
    }

    _Remove( nod / 2 );
}

int main()
{
    fscanf(in,"%d",&n);

    for(i=0 ; i<4*dim ; ++i)
        Arb[ i ] = INF;

    for(i=1 ; i<=n ; ++i)
    {
        fscanf(in,"%d",&q);
        if( q == 1 )
        {
            fscanf(in,"%d",&val);
            ++addPos;
            _Add( 1 , 1 , n );
        }
        else if( q == 2 )
        {
            fscanf(in,"%d",&removePos);
            removePos = Pos[ removePos ];
            _Remove( removePos );
        }
        else if( q == 3 )
        {
            fprintf(out,"%d\n",Arb[1]);
        }
    }

return 0;
}