Pagini recente » Cod sursa (job #177804) | Cod sursa (job #842617) | Cod sursa (job #3133364) | Cod sursa (job #12068) | Cod sursa (job #3142753)
#include <iostream>
#include <stdio.h>
#include <vector>
#define NMAX 200000
using namespace std;
struct str {
int true_index;
int val;
} heap[NMAX];
int heapsize;
int v[NMAX];
int position_in_heap[NMAX];
inline int heap_parent( int i ) { return ( i - 1 ) / 2; }
inline int heap_left( int i ) { return i * 2 + 1; }
inline int heap_right( int i ) { return i * 2 + 2; }
void upHeap( int i, int index ) {
while( i > 0 && heap[heap_parent(i)].val >= heap[i].val ) {
swap( position_in_heap[index], position_in_heap[ heap[heap_parent(i)].true_index ] );
swap( heap[heap_parent(i)], heap[i] );
i = heap_parent( i );
}
}
void downHeap( int i ) {
int left, right, minn;
left = heap_left( i );
right = heap_right( i );
minn = i;
if( left < heapsize && heap[left].val <= heap[minn].val )
minn = left;
if( right < heapsize && heap[right].val <= heap[minn].val )
minn = right;
if( i != minn ) {
swap( position_in_heap[ heap[i].true_index ], position_in_heap[ heap[minn].true_index ] );
swap( heap[i], heap[minn] );
downHeap( minn );
}
}
void heap_insert( int value, int index ) {
heap[heapsize++].val = value;
heap[heapsize-1].true_index = index;
position_in_heap[index] = heapsize - 1;
upHeap( heapsize - 1, index );
}
int getMin() {
return heap[0].val;
}
void extractMin() {
swap( position_in_heap[ heap[0].true_index ], position_in_heap[ heap[heapsize-1].true_index ] );
swap( heap[0], heap[--heapsize] );
downHeap( 0 );
}
void update( int i, int value ) {
heap[i].val = value;
upHeap( i, heap[i].true_index );
downHeap( i );
}
void heap_delete( int i ) {
update( i, getMin() );
extractMin();
}
int main() {
FILE *fin, *fout;
int n, i, tip, x, cnt;
fin = fopen( "heapuri.in", "r" );
fout = fopen( "heapuri.out", "w" );
fscanf( fin, "%d", &n );
cnt = 0;
for( i = 0; i < n; i++ ) {
fscanf( fin, "%d", &tip );
if( tip == 1 ) {
fscanf( fin, "%d", &x );
v[cnt] = x;
heap_insert( x, cnt );
cnt++;
}
else if( tip == 2 ) {
fscanf( fin, "%d", &x );
x--;
heap_delete( position_in_heap[x] );
}
else {
fprintf( fout, "%d\n", getMin() );
}
}
fclose( fin );
fclose( fout );
return 0;
}