Pagini recente » Cod sursa (job #3201188) | Cod sursa (job #28606) | Cod sursa (job #1224555) | Cod sursa (job #2720211) | Cod sursa (job #615668)
Cod sursa(job #615668)
#include <fstream>
#include <cstdlib>
#define N_MAX 200011
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; }
void DownHeap( int k )
{
for( int son=k<<1; son <= lHeap; k=son, son<<=1 )
{
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;
}
}
void UpHeap( int k )
{
for( int key=v[H[k]], f=k>>1; k && key < v[H[f]]; k=f, f>>=1 )
{
_swap( H[k], H[f] );
P[H[k]]=k;
P[H[f]]=f;
}
}
inline void push( int x )
{
H[++lHeap]=x;
P[x]=lHeap;
UpHeap( lHeap );
}
inline void pop( int x )
{
H[P[x]]=H[lHeap];
P[H[lHeap]]=P[x];
--lHeap;
DownHeap( P[x] );
}
int main( void )
{
int N, i, op, x;
ifstream in( "heapuri.in" );
ofstream out( "heapuri.out" );
for( i=0, in>>N; N; --N )
{
in>>op;
switch(op)
{
case 1 : in>>x; v[++i]=x; push(i); break;
case 2 : in>>x; pop(x); break;
case 3 : out<<v[H[1]]<<'\n';
}
}
return EXIT_SUCCESS;
}