Pagini recente » Cod sursa (job #241890) | Cod sursa (job #800114) | Cod sursa (job #3040684) | Cod sursa (job #1710428) | Cod sursa (job #1401467)
#include <stdio.h>
#define MAX_N 200000
int v[MAX_N];
int nElem;
int h[MAX_N];
int hpos[MAX_N];
int hSize;
void sift(int *size, int k) {
int best, changed;
do {
changed = 0;
best = k;
if ((2 * k + 1 < *size) && (v[h[2 * k + 1]] < v[h[best]])) {
best = 2 * k + 1;
}
if ((2 * k + 2 < *size) && (v[h[2 * k + 2]] < v[h[best]])) {
best = 2 * k + 2;
}
if (best != k) {
hpos[h[k]] = best;
hpos[h[best]] = k;
int tmp = h[k];
h[k] = h[best];
h[best] = tmp;
k = best;
changed = 1;
}
} while (changed);
}
void percolate(int k) {
int a = h[k];
int p = (k - 1) / 2;
while (k && (v[a] < v[h[p]])) {
hpos[h[k]] = p;
hpos[h[p]] = k;
int tmp = h[k];
h[k] = h[p];
h[p] = tmp;
k = p;
p = (k - 1) / 2;
}
hpos[a] = k;
h[k] = a;
}
void heapInsert(int *size, int k) {
h[*size] = k;
hpos[k] = *size;
++*size;
percolate(*size - 1);
}
void heapExtract(int *size, int k) {
--*size;
hpos[h[*size]] = k;
h[k] = h[*size];
if (k && (v[h[k]] < v[h[(k - 1) / 2]])) {
percolate(k);
} else {
sift(size, k);
}
}
int main (void) {
FILE *f, *g;
char c;
int query, x;
f = fopen("heapuri.in", "r");
fscanf(f, "%d ", &query);
g = fopen("heapuri.out", "w");
for (; query; --query) {
fscanf(f, " %c", &c);
switch (c) {
case '1':
fscanf(f, "%d", &x);
v[nElem] = x;
heapInsert(&hSize, nElem);
nElem++;
break;
case '2':
fscanf(f, "%d", &x);
heapExtract(&hSize, hpos[x - 1]);
break;
case '3':
fprintf(g, "%d\n", v[h[0]]);
break;
}
}
fclose(f);
fclose(g);
return 0;
}