Pagini recente » Cod sursa (job #2711003) | Cod sursa (job #1453960) | Cod sursa (job #2360688) | Cod sursa (job #481280) | Cod sursa (job #2932005)
#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';
}
}
}