Pagini recente » Cod sursa (job #622212) | Welcome! :D | Cod sursa (job #1025140) | Cod sursa (job #3187225) | Cod sursa (job #2545818)
#include <stdio.h>
int v[200001];
int h[200001];
int pos[200001];
int nh, nc;
void schimba(int ah, int bh) {
int aux;
aux = h[ah];
h[ah] = h[bh];
h[bh] = aux;
pos[h[ah]] = ah;
pos[h[bh]] = bh;
}
void urca(int ih) {
while (ih > 1 && v[h[ih]] < v[h[ih / 2]]) {
schimba(ih, ih / 2);
ih /= 2;
}
}
void adauga(int x) {
h[++nh] = x;
pos[x] = nh;
urca(nh);
}
void coboara(int ih) {
int fs = ih * 2, fd = ih * 2 + 1;
int bun = ih;
if (fs <= nh && v[h[fs]] < v[h[bun]]) {
bun = fs;
}
if (fd <= nh && v[h[fd]] < v[h[bun]]) {
bun = fd;
}
if (bun != ih) {
schimba(bun, ih);
coboara(bun);
}
}
void sterge(int ih) {
schimba(nh--, ih);
urca(ih);
coboara(ih);
}
int main() {
FILE *fin = fopen("heapuri.in", "r"),
*fout = fopen("heapuri.out", "w");
int n;
fscanf(fin, "%d", &n);
int i;
for (i = 0; i < n; i++) {
int op, x;
fscanf(fin, "%d", &op);
switch (op) {
case 1:
fscanf(fin, "%d", &x);
v[++nc] = x;
adauga(nc);
break;
case 2:
fscanf(fin, "%d", &x);
sterge(pos[x]);
break;
case 3:
fprintf(fout, "%d\n", v[h[1]]);
break;
}
}
fclose(fin);
fclose(fout);
return 0;
}