Cod sursa(job #2409512)

Utilizator copanelTudor Roman copanel Data 19 aprilie 2019 10:01:42
Problema Heapuri Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>

int h[200001];
int v[200001];
int pos[200001];
int nr, elem;

void swap(int p, int q) {
	int aux = h[p];
	h[p] = h[q];
	h[q] = aux;
	pos[h[p]] = p;
	pos[h[q]] = q;
}

void urca(int p) {
	while (p > 1 && v[h[p]] < v[h[p / 2]]) {
		swap(p, p / 2);
		p /= 2;
	}
}

void adauga(int p) {
	h[++nr] = p;
	pos[h[nr]] = nr;
	urca(nr);
}

void coboara(int p) {
	int fs = 2 * p, fd = 2 * p + 1, bun = p;
	if (fs <= nr && v[h[fs]] < v[h[bun]]) {
		bun = fs;
	}
	if (fd <= nr && v[h[fd]] < v[h[bun]]) {
		bun = fd;
	}
	if (bun != p) {
		swap(p, bun);
		coboara(bun);
	}
}

void sterge(int p) {
	if (p == nr) {
		nr--;
	} else {
		swap(p, nr--);
		urca(p);
		coboara(p);
	}
}

int main() {
	FILE *fin = fopen("heapuri.in", "r"),
	     *fout = fopen("heapuri.out", "w");
	int n, i, op, x;

	fscanf(fin, "%d", &n);
	for (i = 0; i < n; i++) {
		fscanf(fin, "%d", &op);
		switch (op) {
		case 1:
			fscanf(fin, "%d", &x);
			v[elem++] = x;
			adauga(elem - 1);
			break;
		case 2:
			fscanf(fin, "%d", &x);
			sterge(pos[x - 1]);
			break;
		case 3:
			fprintf(fout, "%d\n", v[h[1]]);
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}