Cod sursa(job #2617948)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 23 mai 2020 13:15:19
Problema Heapuri Scor 10
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include <stdio.h>


#define nmax 200001
struct heap {
    int val, index;
} v[nmax];
int poz_heap, co;
int poz_nod[nmax];


void urcare_heap( int poz ) {
    struct heap aux;
    while ( poz / 2 > 0 && v[ poz / 2 ].val > v[ poz ].val ) { ///interschimbam elementul cu tatal sau
        poz_nod[ v[ poz / 2 ].index ] = poz;
        poz_nod[ v[ poz ].index ] = poz / 2;
        aux = v[ poz / 2 ];
        v[ poz / 2 ] = v[ poz ];
        v[ poz ] = aux;
        poz /= 2;
    }
}


void coborare_heap( int poz ) {
    struct heap aux;
    while ( ( poz * 2 <= poz_heap && v[ poz * 2 ].val < v[ poz ].val ) ||
            ( ( poz * 2 + 1 ) <= poz_heap && v[ poz * 2 + 1 ].val < v[ poz ].val ) ) {
        if ( v[ poz * 2 ].val < v[ poz ].val ) {
            poz_nod[ v[ poz * 2 ].index ] = poz;
            poz_nod[ v[ poz ].index ] = poz * 2;
            aux = v[ poz * 2 ];
            v[ poz * 2 ] = v[ poz ];
            v[ poz ] = aux;
            poz *= 2;
        }
        else {
            poz_nod[ v[ poz * 2 + 1 ].index ] = poz;
            poz_nod[ v[ poz ].index ] = poz * 2 + 1;
            aux = v[ poz * 2 + 1 ];
            v[ poz * 2 + 1 ] = v[ poz ];
            v[ poz ] = aux;
            poz = poz * 2 + 1;
        }
    }
}


void inserare_heap( int nr ) {
    poz_heap++;
    co++;
    v[ poz_heap ].val = nr; ///inseram nr pe ultima pozitie in heap
    v[ poz_heap ].index = co;
    poz_nod[ co ] = poz_heap;
    if ( poz_heap > 1 && v[ poz_heap / 2 ].val > v[ poz_heap ].val )
        urcare_heap( poz_heap );
    else
        coborare_heap( poz_heap );
}


void stergere_heap( int ordin_insertie ) {
    int poz;
    struct heap aux;
    poz = poz_nod[ ordin_insertie ];
    poz_nod[ ordin_insertie ] = poz_heap;
    poz_nod[ poz_heap ] = ordin_insertie;
    aux = v[ poz ];
    v[ poz ] = v[ poz_heap ];
    v[ poz_heap ] = aux;
    poz_heap--;
    if ( poz > 1 && v[ poz / 2 ].val > v[ poz ].val )
        urcare_heap( poz );
    else
        coborare_heap( poz );
}


int main() {
    int n, i, ver, nr;
    FILE *fin, *fout;
    fin = fopen( "heapuri.in", "r" );
    fout = fopen( "heapuri.out", "w" );
    fscanf( fin, "%d", &n );
    for ( i = 0; i < n; i++ ) {
        fscanf( fin, "%d", &ver );
        if ( ver == 3 )
            fprintf( fout, "%d\n", v[ 1 ] );
        else {
            fscanf( fin, "%d", &nr );
            if ( ver == 1 )
                inserare_heap( nr );
            else
                stergere_heap( nr );
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}