Pagini recente » Cod sursa (job #739483) | Cod sursa (job #407354) | Cod sursa (job #2675070) | Cod sursa (job #2182551) | Cod sursa (job #582484)
Cod sursa(job #582484)
#include <fstream>
#include <cstdlib>
#define N_MAX 200011
#define MaxBuffer 8192
using namespace std;
int lHeap, bufferIndex=-1;
char buffer[MaxBuffer];
int v[N_MAX], H[N_MAX], P[N_MAX];
inline void Read( ifstream& in, int& x )
{
int sgn=1;
if( -1 == bufferIndex )
{
in.read( buffer, MaxBuffer );
bufferIndex=0;
}
while( buffer[bufferIndex] < '0' || buffer[bufferIndex] > '9' )
{
if( '-' == buffer[bufferIndex] )
sgn*=-1;
if( ++bufferIndex == MaxBuffer )
{
in.read( buffer, MaxBuffer );
bufferIndex=0;
}
}
for( x=0; buffer[bufferIndex] >= '0' && buffer[bufferIndex] <= '9'; )
{
x=x*10+buffer[bufferIndex]-'0';
if( ++bufferIndex == MaxBuffer )
{
in.read( buffer, MaxBuffer );
bufferIndex=0;
}
}
x*=sgn;
}
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 > 1 && 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 k )
{
H[++lHeap]=k;
P[k]=lHeap;
UpHeap( lHeap );
}
inline void pop( int k )
{
H[P[k]]=H[lHeap];
P[H[lHeap]]=P[k];
--lHeap;
DownHeap( P[k] );
}
int main( void )
{
int N, i, j, k=0;
ifstream in( "heapuri.in" );
ofstream out( "heapuri.out" );
for( Read( in, N); N; --N )
{
Read( in, i );
switch(i)
{
case 1 : Read( in, j); v[++k]=j, push(k); break;
case 2 : Read( in, j); pop(j); break;
case 3 : out<<v[H[1]]<<'\n'; break;
}
}
return EXIT_SUCCESS;
}