Cod sursa(job #1183495)

Utilizator hrazvanHarsan Razvan hrazvan Data 9 mai 2014 14:36:30
Problema Heapuri Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#define N_MAX 200000
int heap[ N_MAX ], point[ N_MAX ], point2[ N_MAX ], ind = 0;

void schimb ( int p1, int p2 ){
    int aux = heap[ p1 ];
    heap[ p1 ] = heap[ p2 ];
    heap[ p2 ] = aux;

    aux = point[ point2[ p1 ] ];
    point[ point2[ p1 ] ] = point[ point2[ p2 ] ];
    point[ point2[ p2 ] ] = aux;

    aux = point2[ p1 ];
    point2[ p1 ] = point2[ p2 ];
    point2[ p2 ] = aux;
    return ;
}

void urc ( int x ){
    if ( x == 0 )   return ;
    if ( heap[ x ] < heap[ ( x - 1 ) / 2 ] ){
        schimb ( x, ( x - 1 ) / 2 );
        urc ( ( x - 1 ) / 2 );
    }
    return ;
}

void cobor ( int x ){
    if ( x == ind - 1 ) return ;
    int a = 2 * x + 1, b = 2 * x + 2;
    if ( b < ind ){
        if ( heap[ b ] < heap[ a ] && heap[ b ] < heap[ x ] ){
            schimb ( x, b );
            cobor ( b );
        }
        else  if ( heap[ a ] < heap[ x ] ){
            schimb ( x, a );
            cobor ( a );
        }
    }
    else if ( a < ind ) if ( heap[ x ] > heap[ a ] ){
        schimb ( x, a );
        cobor ( a );
    }
    return ;
}

int main()
{
    FILE *in = fopen ( "heapuri.in", "r" );
    FILE *out = fopen ( "heapuri.out", "w" );
    int n;
    fscanf ( in, "%d", &n );
    int i, tip, x, aux;
    for ( i = 0; i < n; i++ ){
        fscanf ( in, "%d", &tip );
        if ( tip == 1 ){
            fscanf ( in, "%d", &x );
            heap[ ind ] = x;
            point[ ind ] = ind;
            point2[ ind ] = ind;
            urc ( ind );
            ind++;
        }
        else  if ( tip == 2 ){
            fscanf ( in, "%d", &x );
            x--;
            aux = point[ x ];
            schimb ( aux, ind - 1 );
            ind--;
            if ( aux < ind )  cobor ( aux );
        }
        else    fprintf ( out, "%d\n", heap[ 0 ] );
    }
    fclose ( in );
    fclose ( out );
    return 0;
}