Cod sursa(job #3240253)

Utilizator CosminaneBoac Mihai Cosmin Cosminane Data 13 august 2024 15:41:04
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
using namespace std;
struct element {
	int x, poz;
};
int pozitii[262200];
element v[262200];
int main() {
	int n, elem, i, cod, x, poz;
	element aux;
	ifstream fin( "heapuri.in");
	ofstream fout( "heapuri.out");
	fin >> n;
	elem = 0;
	for (i = 1; i <= n; i++) {
		fin >> cod;
		if (cod == 1) {
			fin >> v[elem].x;
			v[elem].poz = i;
			pozitii[i] = elem;
			poz = elem;
			elem++;
			while (poz > 1 && v[poz / 2].x > v[poz].x) {
				pozitii[v[poz].poz] = poz / 2;
				pozitii[v[poz / 2].poz] = poz;
				aux = v[poz / 2];
				v[poz / 2] = v[poz];
				v[poz] = aux;
				poz /= 2;
			}
		}
		else if (cod == 2) {
			fin >> x;
			poz = pozitii[x];
			pozitii[v[elem - 1].poz] = poz;
			v[poz] = v[elem - 1];
			elem--;
			while ( ( poz * 2 + 1 <= elem && v[poz].x > min(v[poz * 2].x, v[poz * 2 + 1].x) ) || (poz * 2 <= elem && v[poz].x > v[poz * 2].x) ) {
				if (v[poz * 2].x < v[poz * 2 + 1].x || poz * 2 + 1 > elem) {
					pozitii[v[poz].poz] = poz * 2;
					pozitii[v[poz * 2].poz] = poz;
					aux = v[poz];
					v[poz] = v[poz * 2];
					v[poz * 2] = aux;
					poz *= 2;
				}
				else {
					pozitii[v[poz].poz] = poz * 2 + 1;
					pozitii[v[poz * 2 + 1].poz] = poz;
					aux = v[poz];
					v[poz] = v[poz * 2 + 1];
					v[poz * 2 + 1] = aux;
					poz = poz * 2 + 1;
				}
			}
		}
		else {
			fout << v[0].x << '\n';
		}
	}
	return 0;
}