Pagini recente » Cod sursa (job #666258) | Cod sursa (job #531434) | Cod sursa (job #549276) | Cod sursa (job #2358657) | Cod sursa (job #2294027)
#include <fstream>
#define N_MAX 200005
using namespace std;
ifstream in { "heapuri.in" };
ofstream out { "heapuri.out" };
int n, timp;
int heap[N_MAX], t[N_MAX], t_ind[N_MAX];
inline void swap_nodes(int i, int j) {
swap(t_ind[i], t_ind[j]);
swap(t[t_ind[i]], t[t_ind[j]]);
swap(heap[i], heap[j]);
}
inline int min_child(int i) {
int minim { 2 * i };
if (minim + 1 <= n && heap[minim + 1] < heap[minim])
++minim;
return minim;
}
void heap_up(int i) {
for (; i / 2 && heap[i] < heap[i / 2]; i /= 2)
swap_nodes(i, i / 2);
}
void heap_down(int i) {
while (i * 2 <= n) {
int i_min { min_child(i) };
if (heap[i_min] > heap[i])
break;
swap_nodes(i, i_min);
i = i_min;
}
}
void insert(int val) {
heap[++n] = val;
t[++timp] = n;
t_ind[n] = timp;
heap_up(n);
}
void erase(int time_entered) {
int poz { t[time_entered] };
if (poz == n--)
return;
swap_nodes(poz, n + 1);
if (poz / 2 && heap[poz] < heap[poz / 2]) {
heap_up(poz);
} else if (2 * poz <= n) {
int i_min { min_child(poz) };
if (heap[i_min] < heap[poz])
heap_down(poz);
}
}
int main() {
int m; in >> m;
while (m--) {
int cod, val { 0 };
in >> cod;
if (cod == 1 || cod == 2)
in >> val;
if (cod == 1)
insert(val);
else if (cod == 2)
erase(val);
else
out << heap[1] << '\n';
}
}