Pagini recente » Cod sursa (job #950717) | Cod sursa (job #2585259) | Cod sursa (job #2617547) | Cod sursa (job #2801159) | Cod sursa (job #854991)
Cod sursa(job #854991)
#include <stdio.h>
#include <stdlib.h>
#define nmax 200001
int N , heap [ nmax ] , op , x , nr , aaa ;
int poz [ 1 << 10 ] , time [ nmax ] ;
void swap ( int &a , int &b )
{
int aux = a ;
a = b ;
b = aux ;
aux = poz [ a ] ;
poz [ a ] = poz [ b ] ;
poz [ b ] = aux ;
}
void upheap ( int k )
{
if ( k / 2 >= 1 )
if ( heap [ k / 2 ] > heap [ k ] )
{
swap ( heap [ k / 2 ] , heap [ k ] ) ;
upheap ( k / 2 ) ;
}
}
void downheap ( int k )
{
if ( 2 * k <= nr )
{
int min = 2 * k ;
if ( 2 * k + 1 <= nr && heap [ 2 * k + 1 ] < heap [ 2 * k ] )
min = 2 * k + 1 ;
if ( heap [ min ] < heap [ k ] )
{
swap ( heap [ k ] , heap [ min ] ) ;
downheap ( min ) ;
}
}
}
int main ()
{
FILE *fin , *fout ;
fin = fopen ( "heapuri.in" , "rt" ) ;
fout = fopen ( "heapuri.out" , "wt" ) ;
int j = 1 ;
fscanf ( fin , "%d " , &N ) ;
for ( int i = 1 ; i <= N ; i++ )
{
fscanf ( fin , "%d" , &op ) ;
if ( op == 1 )
{
fscanf ( fin , "%d" , &x ) ;
nr++ ;
heap [ nr ] = x ;
time [ j ] = x ;
poz [ x ] = nr ;
j++ ;
upheap ( nr ) ;
continue ;
}
if ( op == 2 )
{
fscanf ( fin , "%d" , &x ) ;
aaa = heap [ nr ] ;
swap ( heap [ nr ] , heap [ poz [ time [ x ] ] ] ) ;
nr-- ;
downheap ( poz [ aaa ] ) ;
continue ;
}
fprintf ( fout , "%d\n" , heap [ 1 ] ) ;
}
fclose ( fin ) ;
fclose ( fout ) ;
return 0 ;
}