Cod sursa(job #2932005)

Utilizator namesurname01Name Surname namesurname01 Data 1 noiembrie 2022 15:24:05
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 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) {
	int parentWheneEntered = minHeap[switchNode];
	whenEntered = minHeap[node];
	int parentPositionInHeap = associatedPositionInHeap[parentWheneEntered]; //which is actually switchNode
	minHeap[switchNode] = whenEntered;
	minHeap[node] = parentWheneEntered;
	associatedPositionInHeap[whenEntered] = switchNode;
	associatedPositionInHeap[parentWheneEntered] = node;
}
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 positionInHeap = associatedPositionInHeap[whenEntered];
	minHeap[positionInHeap] = minHeap[totalNodesInHeap];
	associatedPositionInHeap[minHeap[totalNodesInHeap]] = positionInHeap;
	--totalNodesInHeap;
	while (true) {
		if (2 * positionInHeap + 1 <= totalNodesInHeap && values[minHeap[positionInHeap]] > values[minHeap[2 * positionInHeap + 1]]) { 
			swapNodes(positionInHeap, 2 * positionInHeap + 1);
		}
		else {
			if (2 * positionInHeap <= totalNodesInHeap && values[minHeap[positionInHeap]] > values[minHeap[2 * positionInHeap]]) {
				swapNodes(positionInHeap, 2 * 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';
		}
	}
	
}