Pagini recente » Cod sursa (job #1876032) | Istoria paginii runda/simulare_tractoare | Cod sursa (job #2877389) | Cod sursa (job #812277) | Cod sursa (job #846634)
Cod sursa(job #846634)
#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 up ( int i )
{
if ( i > 1 )
if ( heap[i] < heap [i>>2] )
{
swap ( heap[i] , heap[i>>2] );
up ( 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;
up ( 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;
}
printf ( "%d\n" , heap[1] );
}
fclose ( fin );
fclose ( fout );
return 0 ;
}