Pagini recente » Rating Vartolomei Tudor (vtudor95) | Cod sursa (job #989588) | Cod sursa (job #398092) | Cod sursa (job #3201200) | Cod sursa (job #1248241)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
typedef int heap_t;
const int MAXN = 200001;
struct Heap {
heap_t data[MAXN];
int heap[MAXN], pos_heap[MAXN], data_size, heap_size;
Heap() : data_size(0), heap_size(0) {}
int parent(int pos) { return (pos - 1) / 2; }
int left_child(int pos) { return 2 * pos + 1; }
int right_child(int pos) { return 2 * pos + 2; }
void swaph(int i, int j) {
swap(heap[i], heap[j]);
pos_heap[heap[i]] = i;
pos_heap[heap[j]] = j;
}
bool is_less(int i, int j) { return data[heap[i]] < data[heap[j]]; }
void up(int i) {
for (int p = parent(i); p != i && is_less(i, p); i = p, p = parent(p))
swaph(i, p);
}
void down(int i) {
int next;
while (true) {
if (left_child(i) < heap_size)
next = left_child(i);
else return;
if (right_child(i) < heap_size && is_less(right_child(i), next))
next = right_child(i);
if (! is_less(next, i)) return;
swaph(i, next);
i = next;
}
}
void insert(int x) {
data[data_size] = x;
pos_heap[data_size] = heap_size;
heap[heap_size] = data_size;
data_size++;
up(heap_size++);
}
void remove(int i) {
i = pos_heap[i];
swaph(i, --heap_size);
down(i);
}
int top() { return data[heap[0]]; }
} H;
int main() {
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int q, op, x, i;
for (fin >> q; q; --q) {
fin >> op;
if (op == 1) {
fin >> x;
H.insert(x);
}
else if (op == 2) {
fin >> i;
H.remove(i-1);
}
else
fout << H.top() << endl;
}
return 0;
}