Pagini recente » Cod sursa (job #3289391) | Cod sursa (job #1157394) | Cod sursa (job #616522) | Cod sursa (job #1241110) | Cod sursa (job #2617948)
#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;
}