Pagini recente » Cod sursa (job #3250101) | Cod sursa (job #1056202) | Cod sursa (job #2738309) | Cod sursa (job #2701381) | Cod sursa (job #580735)
Cod sursa(job #580735)
#include <cstdio>
#include <cassert>
const int MAX_N = 200001;
int n, vSize, heapSize;
int v[MAX_N], heap[MAX_N], pos[MAX_N];
void swap ( int &a, int &b ) {
a ^= b ^= a ^= b;
}
/*void printHeap() {
for (int i = 1; i <= heapSize; ++i)
fprintf(stderr, "%d(%d) ", heap[i], v[heap[i]]);
fprintf(stderr, "\n");
}*/
void insert ( int x ) {
++heapSize; heap[heapSize] = x;
pos[heap[heapSize]] = heapSize;
for (int k = heapSize; k > 1 && v[heap[k/2]] > v[heap[k]]; k = k/2) {
swap(heap[k/2], heap[k]);
pos[heap[k]] = k;
pos[heap[k/2]] = k/2;
}
}
void pop() {
swap(heap[1], heap[heapSize]);
pos[heap[1]] = 1;
--heapSize;
for (int k = 1; k <= heapSize; ) {
int a = 0x3f3f3f3f, b = 0x3f3f3f3f;
if (k*2 <= heapSize) a = v[heap[k*2]];
if (k*2+1 <= heapSize) b = v[heap[k*2+1]];
if (a <= b && a < v[heap[k]]) {
swap(heap[k], heap[k*2]);
pos[heap[k]] = k;
pos[heap[k*2]] = k*2;
k = k*2;
} else
if (b < a && b < v[heap[k]]) {
swap(heap[k], heap[k*2+1]);
pos[heap[k]] = k;
pos[heap[k*2+1]] = k*2+1;
k = k*2+1;
} else {
break;
}
}
}
void pop ( int x ) {
// fprintf(stderr, "Pop v[%d] = %d, position %d in heap\n", x, v[x], pos[x]);
// printHeap();
for (int k = pos[x]; k > 1; k = k/2) {
swap(heap[k/2], heap[k]);
pos[heap[k]] = k;
pos[heap[k/2]] = k/2;
}
// printHeap();
pop();
// printHeap();
}
int main() {
freopen("heapuri.in","rt",stdin);
freopen("heapuri.out","wt",stdout);
scanf("%d",&n);
for (int i = 0, op, x; i < n; ++i) {
scanf("%d",&op);
if (op == 1) {
scanf("%d",&x);
v[vSize] = x; ++vSize;
insert(vSize-1);
} else
if (op == 2) {
scanf("%d",&x);
--x;
pop(x);
} else
if (op == 3) {
x = 0;
printf("%d\n",v[heap[1]]);
}
/* fprintf(stderr, "Operation %d, %d\n", op, x);
fprintf(stderr, "Checking heap:\n");
for (int i = 1; i <= heapSize; ++i) {
int a = 0x3f3f3f3f, b = 0x3f3f3f3f;
if (i*2 <= heapSize) a = v[heap[i*2]];
if (i*2+1 <= heapSize) b = v[heap[i*2+1]];
if (!(v[heap[i]] <= a && v[heap[i]] <= b)) {
fprintf(stderr, "Fail at %d\n", i);
return 1;
}
}*/
}
return 0;
}