Cod sursa(job #2932039)

Utilizator namesurname01Name Surname namesurname01 Data 1 noiembrie 2022 18:13:06
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>

using namespace std;

int minHeap[200002]; //aici memorez indexii, al catela a intrat nodul meu, nu valorile lor
int values[200002]; // pentru nodul intrat al i-lea pot sa ii alfu valoarea.
int associatedPositionInHeap[200002]; // pt nodul care a intrat al i-lea pot sa ii aflu pozitia in heap.
int totalNodesInHeap, whenEntered;

void swapNodes(int node, int switchNode) {
	associatedPositionInHeap[minHeap[node]] = switchNode;
	associatedPositionInHeap[minHeap[switchNode]] = node;

	int aux = minHeap[node];
	minHeap[node] = minHeap[switchNode];
	minHeap[switchNode] = aux;
}
void buttomUp(int node, int givenNodeValue) {

	while (node / 2 > 0 && values[minHeap[node / 2]] > givenNodeValue) {
		swapNodes(node, node / 2);
		node = node / 2;
	}

}

void topDown(int whenEntered) {
	int copPos;
	int positionInHeap = associatedPositionInHeap[whenEntered];
	swapNodes(totalNodesInHeap, positionInHeap);
	--totalNodesInHeap;
	while (true) {
		copPos = positionInHeap;
		if (2 * copPos + 1 <= totalNodesInHeap && values[minHeap[positionInHeap]] > values[minHeap[2 * copPos + 1]]) {
			positionInHeap = 2 * copPos + 1;
			
		}	//vezi ca in minHeap NU exista nicio relatie intre fiul stang si fiul drept

		if (2 * copPos <= totalNodesInHeap && values[minHeap[positionInHeap]] > values[minHeap[2 * copPos]]) {
			positionInHeap = 2 * copPos;
		}
		if (copPos != positionInHeap) {
			swapNodes(copPos, positionInHeap);
		}
		else {
			break;
		}
	}

}

int main() {
	ifstream f("heapuri.in");
	ofstream g("heapuri.out");
	int n, op, x;
	f >> n;
	for (int i = 1; i <= n; ++i) {
		f >> op;
		if (op != 3) {
			f >> x;
			if (op == 1) {
				++whenEntered;
				++totalNodesInHeap;
				minHeap[totalNodesInHeap] = whenEntered; //daca nu memoram indexii, nu avema cum sa folosim vectorii, pt ca valoarea unui nod poate fi 1 000 000 000, dar inexii lui nu depasesc 200 000
				values[whenEntered] = x;
				associatedPositionInHeap[whenEntered] = totalNodesInHeap;
				buttomUp(totalNodesInHeap, x);
			}
			else {
				topDown(x);
			}
		}
		else {
			g << values[minHeap[1]] << '\n';
		}
	}
	
}