Pagini recente » Borderou de evaluare (job #1631278) | Borderou de evaluare (job #1530790) | Cod sursa (job #2771007) | Borderou de evaluare (job #2788611) | Cod sursa (job #548488)
Cod sursa(job #548488)
#include <fstream>
#include <cstdlib>
#define N_MAX 200011
#define oo 1<<20
using namespace std;
int lHeap;
int v[N_MAX], H[N_MAX], P[N_MAX];
inline void _swap( int& x, int& y ) { int aux=x; x=y; y=aux; }
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
inline int _max( int x, int y ) { return ( x >= y ? x : y ); }
inline void DownHeap( int k )
{
for( int son=2*k; son <= lHeap; k=son, son=k*2 )
{
if( son < lHeap && v[H[son+1]] < v[H[son]] )
++son;
if( v[H[k]] <= v[H[son]] )
return;
_swap( H[k], H[son] );
P[H[k]]=k;
P[H[son]]=son;
}
}
inline void UpHeap( int k )
{
for( int key=v[H[k]], f=k/2; k > 1 && key < v[H[f]]; k=f, f/=2 )
{
_swap( H[k], H[f] );
P[H[k]]=k;
P[H[f]]=f;
}
}
inline void pop( int x )
{
P[H[lHeap]]=P[x];
H[P[x]]=H[lHeap];
--lHeap;
DownHeap( P[x] );
}
inline void push( int k )
{
H[++lHeap]=k;
P[k]=lHeap;
UpHeap( lHeap );
}
int main( void )
{
int N, i, j=0, op;
ifstream in( "heapuri.in" );
ofstream out( "heapuri.out" );
v[0]=oo;
for( in>>N; N; --N )
{
in>>op;
switch(op)
{
case 1 : ++j; in>>v[j]; push(j); break;
case 2 : in>>i; pop(i); break;
case 3 : out<<v[H[1]]<<'\n'; break;
}
}
return EXIT_SUCCESS;
}