Pagini recente » Cod sursa (job #1473386) | Cod sursa (job #2450698) | Istoria paginii runda/dexter/clasament | Cod sursa (job #2095943) | Cod sursa (job #846629)
Cod sursa(job #846629)
#include <stdio.h>
#include <stdlib.h>
int heap[200000] , ordine[200000] , n , i;
int op , k , ord , a , nr = 0 ;
void swap ( int &a , int &b )
{
int aux;
aux = a;
a = b;
b = aux;
}
void down ( int k )
{
if ( k < nr )
if ( heap[k] > heap[2*k] && 2*k <= nr )
{
swap ( heap[k] , heap[2*k] );
down ( 2*k );
}
else if ( heap[k] > heap[2*k+1] && 2*k+1 <= nr )
{
swap ( heap[k] , heap[2*k+1] );
down ( 2*k + 1 );
}
}
void heapify ( int i )
{
if ( i > 1 )
if ( heap[i] < heap [i/2] )
{
swap ( heap[i] , heap[i/2] );
heapify ( i/2 );
}
else return;
else return;
}
void caut ( int x , int i )
{
if ( i > nr ) return;
if ( ordine[x] == heap[i] ) a = i ;
else
{
caut ( x , i*2 );
caut ( x , i*2 + 1 );
}
}
int main ()
{
FILE *fin , *fout;
fin = fopen ( "heapuri.in" , "rt" );
fout = fopen ( "heapuri.out" , "wt" ) ;
fscanf ( fin , "%d" , &n );
for ( int i = 1 ; i <= n ; i++ )
{
fscanf ( fin , " %d " , &op );
if ( op == 1 )
{
fscanf ( fin , "%d" , &k );
nr++;
heap[nr] = k;
heapify ( nr );
ord++;
ordine[ord] = k;
continue;
}
if ( op == 2 )
{
fscanf ( fin , "%d" , &k );
caut ( k , 1 );
swap ( heap[nr] , heap[a] );
nr--;
down ( 1 );
continue;
}
fprintf ( fout , "%d\n" , heap[1] );
}
fclose ( fin );
fclose ( fout );
return 0 ;
}