Pagini recente » Cod sursa (job #2052005) | Cod sursa (job #1602967) | Cod sursa (job #214526) | Cod sursa (job #573233) | Cod sursa (job #1075780)
#include <cstdio>
using namespace std;
const int NMAX = 200005;
int N, H, A;
int heap[NMAX], array[NMAX];
inline void swap(int a, int b) {
int aux = heap[a];
heap[a] = heap[b];
heap[b] = aux;
}
inline void up_heapify(int index) {
int aux = heap[index];
while( index > 1 && aux < heap[index >> 1]) {
swap(index, index >> 1);
index >>= 1;
}
}
inline void down_heapify(int index) {
while( true ) {
int min = index;
if( (index << 1) <= H && heap[index << 1] < heap[min] )
min = index << 1;
if( ((index << 1) + 1) <= H && heap[(index << 1) + 1] < heap[min] )
min = (index << 1) + 1;
if( index != min ) {
swap(index, min);
index = min;
} else
break;
}
}
inline void insert(int elem) {
array[++A] = elem;
heap[++H] = elem;
up_heapify(H);
}
inline void remove(int elem) {
for(int i = 1; i <= H; i++)
if( heap[i] == elem ) {
swap(i, H--);
down_heapify(i);
break;
}
}
void read() {
freopen( "heapuri.in", "r", stdin );
freopen( "heapuri.out", "w", stdout );
scanf("%i", &N);
int type, n;
for(int i = 0; i < N; i++) {
scanf("%i", &type);
switch(type) {
case(1): scanf("%i", &n); insert(n); break;
case(2): scanf("%i", &n); remove(array[n]); break;
case(3): printf("%i\n", heap[1]); break;
}
}
}
int main() {
read();
return 0;
}