Pagini recente » Cod sursa (job #1353909) | Cod sursa (job #1603536) | Cod sursa (job #1676951) | Cod sursa (job #2433707) | Cod sursa (job #2922782)
#include <stdio.h>
#define MAXN 200000
int v[MAXN], vn, ad[MAXN], nr = 1;
static inline int PARENT(int x) {
if (x == 0)
return 0;
else
return (x - 1) / 2;
}
static inline int CHILD(int x) { return x * 2 + 1; }
static inline void swap(int x, int y) {
int aux = v[x];
v[x] = v[y];
v[y] = aux;
aux = ad[x];
ad[x] = ad[y];
ad[y] = aux;
}
FILE *fdb;
void printx(int x) {
fprintf(fdb, "%d ", v[x]);
if (CHILD(x) < vn)
printx(CHILD(x));
if (CHILD(x) + 1 < vn)
printx(CHILD(x) + 1);
}
void printHeap() {
fprintf(fdb, "Heap: ");
printx(0);
fprintf(fdb, "\n");
}
void climbHeap(int x) {
while (v[x] < v[PARENT(x)]) {
swap(x, PARENT(x));
x = PARENT(x);
}
}
void downHeap(int x) {
int c1 = CHILD(x);
int c2 = CHILD(x) + 1;
int min = -1;
if (c2 < vn) {
if (v[c1] < v[c2])
min = c1;
else
min = c2;
} else if (c1 < vn) {
min = c1;
}
if (min != -1 && v[min] < v[x]) {
swap(x, min);
downHeap(min);
}
}
void addElement(int x) {
v[vn] = x;
ad[vn] = nr;
vn++;
nr++;
climbHeap(vn - 1);
}
void deleteElement(int x) {
swap(x, vn - 1);
vn--;
downHeap(x);
}
int main() {
int n, i, j, t, x;
FILE *fin, *fout;
fdb = fopen("heap.out", "w");
fin = fopen("heapuri.in", "r");
fout = fopen("heapuri.out", "w");
fscanf(fin, "%d", &n);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &t);
if (t == 1) { // Adaugam x
fscanf(fin, "%d", &x);
addElement(x);
} else if (t == 2) {
fscanf(fin, "%d", &x);
j = 0;
while (ad[j] != x && j < vn)
j++;
deleteElement(j);
} else {
fprintf(fout, "%d\n", v[0]);
}
printHeap();
fprintf(fdb, "Ad: ");
for (j = 0; j < vn; j++)
fprintf(fdb, "%d ", ad[j]);
fprintf(fdb, "\n");
}
fclose(fin);
fclose(fout);
fclose(fdb);
return 0;
}