Cod sursa(job #582484)

Utilizator BitOneSAlexandru BitOne Data 15 aprilie 2011 13:50:48
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 200011
#define MaxBuffer 8192

using namespace std;
int lHeap, bufferIndex=-1;
char buffer[MaxBuffer];
int v[N_MAX], H[N_MAX], P[N_MAX];
inline void Read( ifstream& in, int& x )
{
    int sgn=1;
    if( -1 == bufferIndex )
    {
        in.read( buffer, MaxBuffer );
        bufferIndex=0;
    }
    while( buffer[bufferIndex] < '0' || buffer[bufferIndex] > '9' )
    {
        if( '-' == buffer[bufferIndex] )
            sgn*=-1;
        if( ++bufferIndex == MaxBuffer )
        {
            in.read( buffer, MaxBuffer );
            bufferIndex=0;
        }
    }
    for( x=0; buffer[bufferIndex] >= '0' && buffer[bufferIndex] <= '9'; )
    {
        x=x*10+buffer[bufferIndex]-'0';
        if( ++bufferIndex == MaxBuffer )
        {
             in.read( buffer, MaxBuffer );
             bufferIndex=0;
        }
    }
    x*=sgn;
}
void DownHeap( int k )
{
    for( int son=k<<1; son <= lHeap; k=son, son<<=1 )
    {
        if( son < lHeap && v[H[son+1]] < v[H[son]] )
            ++son;
        if( v[H[k]] <= v[H[son]] )
            return;
        swap( H[k], H[son] );
        P[H[k]]=k;
        P[H[son]]=son;
    }
}
void UpHeap( int k )
{
    for( int key=v[H[k]], f=k>>1; k > 1 && key < v[H[f]]; k=f, f>>=1 )
    {
        swap( H[k], H[f] );
        P[H[k]]=k;
        P[H[f]]=f;
    }
}
inline void push( int k )
{
    H[++lHeap]=k;
    P[k]=lHeap;
    UpHeap( lHeap );
}
inline void pop( int k )
{
    H[P[k]]=H[lHeap];
    P[H[lHeap]]=P[k];
    --lHeap;
    DownHeap( P[k] );
}
int main( void )
{
    int N, i, j, k=0;
    ifstream in( "heapuri.in" );
    ofstream out( "heapuri.out" );
    for( Read( in, N); N; --N )
    {
        Read( in, i );
        switch(i)
        {
            case 1 : Read( in, j); v[++k]=j, push(k); break;
            case 2 : Read( in, j); pop(j); break;
            case 3 : out<<v[H[1]]<<'\n'; break;
        }
    }
    return EXIT_SUCCESS;
}