Pagini recente » Cod sursa (job #3190002) | Cod sursa (job #2500378) | Cod sursa (job #244156) | Cod sursa (job #339394) | Cod sursa (job #2291013)
#include <cstdio>
#include <algorithm>
#include <map>
const int MAX_N = 100000;
int heap[1 + MAX_N];
int size;
int added[1 + MAX_N];
std::map<int, int> pos;
void up_rebuild(int node) {
while (node / 2 >= 1 && heap[node] > heap[node / 2]) {
std::swap(pos[heap[node]], pos[heap[node / 2]]);
std::swap(heap[node], heap[node / 2]);
if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
}
node /= 2;
}
if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
}
}
void down_rebuild(int node) {
while (2 * node + 1 <= size && heap[node] < heap[2 * node + 1]) {
std::swap(pos[heap[node]], pos[heap[2 * node + 1]]);
std::swap(heap[node], heap[2 * node + 1]);
if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
}
node = 2 * node + 1;
}
if (node != 1 && heap[node / 2 * 2] < heap[node / 2 * 2 + 1]) {
std::swap(pos[heap[node / 2 * 2]], pos[heap[node / 2 * 2 + 1]]);
std::swap(heap[node / 2 * 2], heap[node / 2 * 2 + 1]);
}
}
void addValue(int x) {
heap[++size] = x;
pos[x] = size;
up_rebuild(size);
}
void deleteValue(int x) {
int last_leaf = heap[size];
std::swap(heap[pos[x]], heap[size]);
std::swap(pos[x], pos[last_leaf]);
size--;
down_rebuild(pos[last_leaf]);
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int n;
scanf("%d", &n);
int k = 0;
for (int i = 1; i <= n; i++) {
int type, x;
scanf("%d", &type);
if (type == 1) {
scanf("%d", &x);
added[++k] = x;
addValue(x);
} else if (type == 2) {
scanf("%d", &x);
x = added[x];
deleteValue(x);
} else {
printf("%d\n", heap[size]);
}
}
return 0;
}