#include <bits/stdc++.h>
using namespace std;
void printMinHeap(vector<int> arr) {
for (int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int getLeftChildIndex(int parentIndex) {
return parentIndex * 2 + 1;
}
int getRightChildIndex(int parentIndex) {
return parentIndex * 2 + 2;
}
int getParentIndex(int childIndex) {
return (childIndex - 1) / 2;
}
void heapifyUp(vector<int> &arr, int index) {
int parentIndex = getParentIndex(index);
while (parentIndex >= 0 && arr[index] < arr[parentIndex]) {
swap(arr[parentIndex], arr[index]);
index = parentIndex;
parentIndex = getParentIndex(index);
}
}
void heapifyDown(vector<int> &arr, int parentIndex) {
int leftChildIndex = getLeftChildIndex(parentIndex);
int smallerChildIndex;
while (leftChildIndex < arr.size()) {
// we need to find out which is smaller
// left child or right child.
smallerChildIndex = leftChildIndex;
int rightChildIndex = getRightChildIndex(parentIndex);
if (rightChildIndex < arr.size() &&
arr[rightChildIndex] < arr[smallerChildIndex]) {
smallerChildIndex = rightChildIndex;
}
if (arr[parentIndex] < arr[smallerChildIndex]) {
// this condition implies, min-heap integrity is
// already maintained.
break;
}
swap(arr[parentIndex], arr[smallerChildIndex]);
parentIndex = smallerChildIndex;
leftChildIndex = getLeftChildIndex(parentIndex);
}
}
void createMinHeap(vector<int> &arr) {
int n = arr.size();
for (int i = n / 2 - 1; i >= 0; i--) {
heapifyDown(arr, i);
}
}
void addElement(vector<int> &arr, int newEle) {
arr.push_back(newEle);
heapifyUp(arr, arr.size() - 1);
}
void removeElement(vector<int> &arr) {
int n = arr.size();
swap(arr[n - 1], arr[0]);
arr.pop_back();
heapifyDown(arr, 0);
}
int main() {
vector<int> arr = {10, 22, 32, 6, 25, 22, 15, 56, 65, 72};
createMinHeap(arr);
printMinHeap(arr);
addElement(arr, 8);
printMinHeap(arr);
removeElement(arr);
printMinHeap(arr);
removeElement(arr);
printMinHeap(arr);
}