Cod sursa(job #1628455)

Utilizator IgorDodonIgor Dodon IgorDodon Data 4 martie 2016 01:00:46
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#include<algorithm>
#define MAXN 200005
FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");

using namespace std;

int N, T, X, lCron=0, Cron[MAXN], lHP=0, HP[MAXN], poz[MAXN];

void inv( int &P1, int P2 ){

    swap( HP[P1], HP[P2] );
    swap( poz[HP[P1]], poz[HP[P2]] );

    P1 = P2;

}

void Echilibreaza( int p ){
int NEWCron, NEWp;

    //in sus
    while( p > 1 && Cron[ HP[p] ] < Cron[ HP[p/2] ] )
        inv( p, p/2 );

    //in jos
    while( p*2 <= lHP ){

        NEWCron = Cron[ HP[p*2] ];
        NEWp = p*2;

        if( p*2+1 <= lHP && Cron[ HP[p*2+1] ] < NEWCron ){
            NEWCron = Cron[ HP[p*2+1] ];
            NEWp = p*2+1;
        }

        if( Cron[ HP[p] ] > NEWCron )
            inv( p, NEWp );
        else
            break;
    }

}

int main(){

    fscanf(f,"%d\n",&N);
    for(int i=1;i<=N;i++){

        fscanf(f,"%d",&T);

        if( T == 1 ){

            fscanf(f,"%d",&X);

            Cron[++lCron] = X;
            HP[++lHP] = lCron;
            poz[lCron] = lHP;

            Echilibreaza(lHP);

        }

        if( T == 2 ){   // eliminare

            fscanf(f,"%d",&X);

            HP[ poz[X] ] = HP[ lHP ];
            poz[ HP[lHP] ] = poz[X];
            lHP--;

            Echilibreaza( poz[X] );

        }

        if( T == 3 )
            fprintf(g,"%d\n",Cron[HP[1]]);

    }

return 0;
}