Pagini recente » Cod sursa (job #32658) | Cod sursa (job #428238) | Cod sursa (job #1554002) | Clasamentul arhivei ACM | Cod sursa (job #3300477)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100004;
int heap_size;
int heap[NMAX]; // indexul de inserare (nu valoarea!)
int heap_val[NMAX]; // valoarea reală corespunzătoare heap[i]
bool valid[NMAX]; // dacă elementul cu indexul de inserare este valid
void check_up(int node_position)
{
int dad_position = node_position / 2;
if (heap_val[heap[dad_position]] > heap_val[heap[node_position]])
{
swap(heap[dad_position], heap[node_position]);
check_up(dad_position);
}
}
void check_down(int node_position)
{
int left_son = node_position * 2;
int right_son = left_son + 1;
int current_min = heap_val[heap[node_position]], min_case = 0;
if (left_son <= heap_size && current_min > heap_val[heap[left_son]])
{
current_min = heap_val[heap[left_son]];
min_case = 1;
}
if (right_son <= heap_size && current_min > heap_val[heap[right_son]])
{
current_min = heap_val[heap[right_son]];
min_case = 2;
}
if (min_case == 1)
{
swap(heap[node_position], heap[left_son]);
check_down(left_son);
}
else if (min_case == 2)
{
swap(heap[node_position], heap[right_son]);
check_down(right_son);
}
}
void insert(int insert_index)
{
heap[++heap_size] = insert_index;
check_up(heap_size);
}
void pop()
{
heap[1] = heap[heap_size];
heap_size--;
check_down(1);
}
void remove(int x)
{
valid[x] = false; // marcam elementul ca invalid (nu il scoatem fizic din heap)
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int op, x, n;
scanf("%d", &n);
int insert_index = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &op);
if (op == 1)
{
scanf("%d", &x);
++insert_index;
heap_val[insert_index] = x;
valid[insert_index] = true;
insert(insert_index);
}
else if (op == 2)
{
scanf("%d", &x);
remove(x);
}
else
{
while (!valid[heap[1]])
pop();
printf("%d\n", heap_val[heap[1]]);
}
}
return 0;
}