Pagini recente » Cod sursa (job #1699222) | Cod sursa (job #2644084) | Cod sursa (job #12496) | Cod sursa (job #2617108) | Cod sursa (job #2932035)
#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];
minHeap[positionInHeap] = minHeap[totalNodesInHeap];
associatedPositionInHeap[minHeap[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';
}
}
}