#include<bits/stdc++.h>
using namespace std;
class MaxHeap{
private:
int size{};
int capacity{1000};
int *arr{};
public:
MaxHeap(){
arr = new int[capacity];
size =0;
}
~MaxHeap(){
delete[] arr;
}
int leftchild(int node){
int ans = 2*node + 1;
return ans >= size? -1 : ans;
}
int rightchild(int node){
int ans = 2*node + 2;
return ans >= size? -1 : ans;
}
int parent(int node){
return node ==0 ? -1 : (node-1)/2;
}
void heapifyUp(int child_pos){
int parent_pos = parent(child_pos);
//base case
if(child_pos ==0||parent_pos==-1 || arr[parent_pos] >arr[child_pos]){
return;
}
swap(arr[parent_pos],arr[child_pos]);
heapifyUp(parent_pos);
}
bool isFull(){
return size == capacity;
}
bool isEmpty(){
return size == 0;
}
void push(int node){
assert(!isFull());
arr[size] = node;
size++;
heapifyUp(size-1);
}
void heapifyDown(int parent_pos){
int left_child = leftchild(parent_pos);
int right_child = rightchild(parent_pos);
int max_child = parent_pos;
if(left_child!= -1 && arr[left_child] > arr[max_child]){
max_child = left_child;
}
if(right_child!= -1 && arr[right_child] > arr[max_child]){
max_child = right_child;
}
if(max_child!= parent_pos){
swap(arr[parent_pos],arr[max_child]);
heapifyDown(max_child);
}
}
void pop(){
assert(!isEmpty());
swap(arr[0],arr[--size]);
heapifyDown(0);
}
int top(){
assert(!isEmpty());
return arr[0];
}
};
int main(){
MaxHeap heap;
heap.push(3);
heap.push(5);
heap.push(8);
cout << "Max heap traversal is : \n";
while(!heap.isEmpty()){
cout << heap.top() << " ";
heap.pop();
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE1heEhlYXB7CiAgICBwcml2YXRlOgogICAgaW50IHNpemV7fTsKICAgIGludCBjYXBhY2l0eXsxMDAwfTsKICAgIGludCAqYXJye307CiAgICBwdWJsaWM6CiAgICBNYXhIZWFwKCl7CiAgICAgICAgYXJyID0gbmV3IGludFtjYXBhY2l0eV07CiAgICAgICAgc2l6ZSA9MDsKICAgIH0KICAgIH5NYXhIZWFwKCl7CiAgICAgICAgZGVsZXRlW10gYXJyOwogICAgfQogICAgaW50IGxlZnRjaGlsZChpbnQgbm9kZSl7CiAgICAgICAgaW50IGFucyA9IDIqbm9kZSArIDE7CiAgICAgICAgcmV0dXJuIGFucyA+PSBzaXplPyAtMSA6IGFuczsKICAgIH0KICAgIGludCByaWdodGNoaWxkKGludCBub2RlKXsKICAgICAgICBpbnQgYW5zID0gMipub2RlICsgMjsKICAgICAgICByZXR1cm4gYW5zID49IHNpemU/IC0xIDogYW5zOwogICAgfQogICAgaW50IHBhcmVudChpbnQgbm9kZSl7CiAgICAgICAgcmV0dXJuIG5vZGUgPT0wID8gLTEgOiAobm9kZS0xKS8yOwogICAgfQogICAgdm9pZCBoZWFwaWZ5VXAoaW50IGNoaWxkX3Bvcyl7CiAgICAgICAgaW50IHBhcmVudF9wb3MgPSBwYXJlbnQoY2hpbGRfcG9zKTsKICAgICAgICAvL2Jhc2UgY2FzZQogICAgICAgIGlmKGNoaWxkX3BvcyA9PTB8fHBhcmVudF9wb3M9PS0xIHx8IGFycltwYXJlbnRfcG9zXSA+YXJyW2NoaWxkX3Bvc10pewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3YXAoYXJyW3BhcmVudF9wb3NdLGFycltjaGlsZF9wb3NdKTsKICAgICAgICBoZWFwaWZ5VXAocGFyZW50X3Bvcyk7CiAgICB9CiAgICBib29sIGlzRnVsbCgpewogICAgICAgIHJldHVybiBzaXplID09IGNhcGFjaXR5OwogICAgfQogICAgYm9vbCBpc0VtcHR5KCl7CiAgICAgICAgcmV0dXJuIHNpemUgPT0gMDsKICAgIH0KICAgIHZvaWQgcHVzaChpbnQgbm9kZSl7CiAgICAgICAgYXNzZXJ0KCFpc0Z1bGwoKSk7CiAgICAgICAgYXJyW3NpemVdID0gbm9kZTsKICAgICAgICBzaXplKys7CiAgICAgICAgaGVhcGlmeVVwKHNpemUtMSk7CiAgICB9CiAgICB2b2lkIGhlYXBpZnlEb3duKGludCBwYXJlbnRfcG9zKXsKICAgICAgICBpbnQgbGVmdF9jaGlsZCA9IGxlZnRjaGlsZChwYXJlbnRfcG9zKTsKICAgICAgICBpbnQgcmlnaHRfY2hpbGQgPSByaWdodGNoaWxkKHBhcmVudF9wb3MpOwoKICAgICAgICBpbnQgbWF4X2NoaWxkID0gcGFyZW50X3BvczsKCiAgICAgICAgaWYobGVmdF9jaGlsZCE9IC0xICYmIGFycltsZWZ0X2NoaWxkXSA+IGFyclttYXhfY2hpbGRdKXsKICAgICAgICAgICAgbWF4X2NoaWxkID0gbGVmdF9jaGlsZDsKICAgICAgICB9CgogICAgICAgIGlmKHJpZ2h0X2NoaWxkIT0gLTEgJiYgYXJyW3JpZ2h0X2NoaWxkXSA+IGFyclttYXhfY2hpbGRdKXsKICAgICAgICAgICAgbWF4X2NoaWxkID0gcmlnaHRfY2hpbGQ7CiAgICAgICAgfQoKICAgICAgICBpZihtYXhfY2hpbGQhPSBwYXJlbnRfcG9zKXsKICAgICAgICAgICAgc3dhcChhcnJbcGFyZW50X3Bvc10sYXJyW21heF9jaGlsZF0pOwogICAgICAgICAgICBoZWFwaWZ5RG93bihtYXhfY2hpbGQpOwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgcG9wKCl7CiAgICAgICAgYXNzZXJ0KCFpc0VtcHR5KCkpOwogICAgICAgIHN3YXAoYXJyWzBdLGFyclstLXNpemVdKTsKICAgICAgICBoZWFwaWZ5RG93bigwKTsKICAgIH0KICAgIGludCB0b3AoKXsKICAgICAgICBhc3NlcnQoIWlzRW1wdHkoKSk7CiAgICAgICAgcmV0dXJuIGFyclswXTsKICAgIH0KfTsKaW50IG1haW4oKXsKICAgIE1heEhlYXAgaGVhcDsKICAgIGhlYXAucHVzaCgzKTsKICAgIGhlYXAucHVzaCg1KTsKICAgIGhlYXAucHVzaCg4KTsKICAgIGNvdXQgPDwgIk1heCBoZWFwIHRyYXZlcnNhbCBpcyA6IFxuIjsKICAgIHdoaWxlKCFoZWFwLmlzRW1wdHkoKSl7CiAgICAgICAgY291dCA8PCBoZWFwLnRvcCgpIDw8ICIgIjsKICAgICAgICBoZWFwLnBvcCgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=