Pagini recente » Cod sursa (job #1956837) | Cod sursa (job #2907771) | Cod sursa (job #2689208) | Cod sursa (job #1256730) | Cod sursa (job #1754507)
#include<bits/stdc++.h>
#define NMAX 200001
#define swapp(x, y) { int tmp = x; x = y; y = tmp; }
using namespace std;
int N, operation, element, heap[NMAX], heapPz[NMAX], numbers[NMAX], counter = 0;
void heapMoveUp(int position) {
while (position / 2 && numbers[heap[position]] < numbers[heap[position / 2]]) {
swapp(heap[position], heap[position / 2]);
swapp(heapPz[heap[position]], heapPz[heap[position / 2]]);
position >>= 1;
}
}
void heapMoveDown(int position) {
int newPosition = -1, left, right;
while(position != newPosition) {
newPosition = position;
left = position * 2;
right = left + 1;
if (left <= heap[0] && numbers[heap[left]] < numbers[heap[newPosition]]) newPosition = left;
if (right <= heap[0] && numbers[heap[right]] < numbers[heap[newPosition]]) newPosition = right;
if (newPosition != position) {
swapp(heap[position], heap[newPosition]);
swapp(heapPz[heap[position]], heapPz[heap[newPosition]]);
position = newPosition;
newPosition = -1;
}
}
}
void heapInsert(int position) {
heap[++heap[0]] = position;
heapPz[position] = heap[0];
heapMoveUp(heap[0]);
}
void heapDelete(int position) {
numbers[position] = -1;
heapMoveUp(heapPz[position]);
swapp(heap[heapPz[position]], heap[heap[0]]);
heapPz[heap[1]] = 1;
--heap[0];
if (heap[0] > 1) heapMoveDown(1);
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &N);
for (int it = 1; it <= N; ++it) {
scanf("%d", &operation);
switch(operation) {
case 1:
scanf("%d", &numbers[++counter]);
heapInsert(counter);
break;
case 2:
scanf("%d", &element);
heapDelete(element);
break;
case 3:
printf("%d\n", numbers[heap[1]]);
break;
}
}
return 0;
}