Pagini recente » Cod sursa (job #461623) | Cod sursa (job #292567) | Cod sursa (job #2205622) | Cod sursa (job #1475457) | Cod sursa (job #2808568)
#include <stdio.h>
#include <iostream>
#define MAX_H 200000
using std::swap;
struct node {
int val;
int poz;
};
node heap[MAX_H];
int nheap;
bool out[MAX_H];
int nop1;
inline int parent( int nod ) {
return (nod - 1) / 2;
}
inline int leftChild( int nod ) {
return nod * 2 + 1;
}
inline int rightChild( int nod ) {
return nod * 2 + 2;
}
void propagUp( int nod ) {
while ( nod && heap[parent( nod )].val > heap[nod].val ) {
swap( heap[parent( nod )], heap[nod] );
nod = parent( nod );
}
}
void propagDown( int nod ) {
int minn = nod;
if ( leftChild( nod ) < nheap && heap[leftChild( nod )].val < heap[minn].val )
minn = leftChild( nod );
if ( rightChild( nod ) < nheap && heap[rightChild( nod )].val < heap[minn].val )
minn = rightChild( nod );
if ( minn != nod ) {
swap( heap[nod], heap[minn] );
propagDown( minn );
}
}
void insertHeap( int val ) {
heap[nheap].val = val;
heap[nheap].poz = nop1 ++;
propagUp( nheap );
nheap ++;
}
int removeMin() {
node aux = heap[0];
heap[0] = heap[-- nheap];
propagDown( 0 );
return aux.val;
}
int main() {
FILE *fin, *fout;
int n, op, x;
fin = fopen( "heapuri.in", "r" );
fout = fopen( "heapuri.out", "w" );
fscanf( fin, "%d", &n );
for ( int i = 0; i < n; i ++ ) {
fscanf( fin, "%d", &op );
if ( op == 1 ) {
fscanf( fin, "%d", &x );
insertHeap( x );
}
else if ( op == 2 ) {
fscanf( fin, "%d", &x );
out[x - 1] = true;
}
else {
while ( out[heap[0].poz] )
removeMin();
fprintf( fout, "%d\n", heap[0].val );
}
}
fclose( fin );
fclose( fout );
return 0;
}