Pagini recente » Cod sursa (job #790258) | Cod sursa (job #401221) | Borderou de evaluare (job #1631969) | Cod sursa (job #3327345) | Cod sursa (job #3356683)
#include <stdio.h>
#define N 200000
int h[N+1], poz_h[N+1], val[N+1], n_h, n_val;
void schimba(int p1, int p2) {
// interschimba elementele din heap aflate pe pozitiile p1 si p2
int aux = h[p1];
h[p1] = h[p2];
h[p2] = aux;
poz_h[h[p1]] = p1;
poz_h[h[p2]] = p2;
}
int tata(int p) {
// p = pozitie din h
return (p / 2);
}
int fiu_stang(int p) {
return (2 * p);
}
int fiu_drept(int p) {
return (2 * p + 1);
}
void urca(int p) {
// p = pozitie din h
while (tata(p) >= 1 && val[h[p]] < val[h[tata(p)]]) {
schimba(p, tata(p));
}
}
void adauga(int p) {
h[++n_h] = p; // p = pozitie din val
poz_h[p] = n_h;
urca(n_h);
}
void coboara(int p) {
int p_min = p;
if (fiu_stang(p) <= n_h && val[h[fiu_stang(p)]] < val[h[p_min]]) {
p_min = fiu_stang(p);
}
if (fiu_drept(p) <= n_h && val[h[fiu_drept(p)]] <= val[h[p_min]]) {
p_min = fiu_drept(p);
}
if (p_min != p) {
schimba(p_min, p);
coboara(p_min);
}
}
void sterge(int p) {
// p = poz in heap
if (p != n_h) {
schimba(p, n_h);
}
n_h--;
urca(p);
coboara(p);
}
int main(void) {
FILE *in = fopen("heapuri.in", "r");
FILE *out = fopen("heapuri.out", "w");
int n_op;
fscanf(in, "%d", &n_op);
for (int i=0; i<n_op; i++) {
int tip;
fscanf(in, "%d", &tip);
if (tip == 1) {
fscanf(in, "%d", &val[++n_val]);
adauga(n_val);
} else if (tip == 2) {
int p;
fscanf(in, "%d", &p); // poz in val
sterge(poz_h[p]);
} else {
fprintf(out, "%d\n", val[h[1]]);
}
}
fclose(in);
fclose(out);
return 0;
}