#pragma once
#include <iostream>
using namespace std;
const int SIZE = 20 ;
class Heap {
private :
int arr[ SIZE] ;
int n;
void heapUp( int child) ;
void heapDown( int parent) ;
//convenience
int left( int i) { return 2 * i + 1 ; }
int right( int i) { return 2 * i + 2 ; }
int parent( int i) { return ( i - 1 ) / 2 ; }
public :
Heap( void ) ;
~Heap( void ) ;
void insert( int value) ;
int remove ( ) ;
void print( ) ;
void sort( ) ;
} ;
#include "Heap.h"
Heap:: Heap ( void ) { n = 0 ; }
Heap:: ~Heap( void ) { }
void Heap:: insert ( int value) {
if ( n == SIZE)
exit ( 1 ) ;
arr[ n] = value;
heapUp( n++ ) ;
}
void Heap:: heapUp ( int i) {
int p = parent( i) ;
if ( arr[ i] > arr[ p] ) {
swap( arr[ i] , arr[ p] ) ;
heapUp( p) ;
}
}
int Heap:: remove ( ) {
if ( n == 0 )
exit ( 1 ) ;
int temp = arr[ 0 ] ;
arr[ 0 ] = arr[ -- n] ;
heapDown( 0 ) ;
arr[ n] = 0 ;
return temp;
}
void Heap:: heapDown ( int i) {
int l = left( i) ;
int r = right( i) ;
// comparing parent to left/right child
// each has an inner if to handle if the first swap causes a second swap
// ie 1 -> 3 -> 5
// 3 5 1 5 1 3
if ( l < n && arr[ i] < arr[ l] ) {
swap( arr[ i] , arr[ l] ) ;
heapDown( l) ;
if ( r < n && arr[ i] < arr[ r] ) {
swap( arr[ i] , arr[ r] ) ;
heapDown( r) ;
}
} else if ( r < n && arr[ i] < arr[ r] ) {
swap( arr[ i] , arr[ r] ) ;
heapDown( r) ;
if ( l < n && arr[ i] < arr[ l] ) {
swap( arr[ i] , arr[ l] ) ;
heapDown( l) ;
}
}
}
void Heap:: print ( ) {
for ( int i = 0 ; i < n; i++ ) {
cout << arr[ i] << " " ;
}
cout << endl;
}
// adding a print inside since the sort itself destroys size incrementor
void Heap:: sort ( ) {
int temp = n;
while ( n > 1 ) {
swap( arr[ -- n] , arr[ 0 ] ) ;
heapDown( 0 ) ;
}
for ( int i = 0 ; i < temp; i++ ) {
cout << arr[ i] << " " ;
}
cout << endl;
}
I3ByYWdtYSBvbmNlCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjb25zdCBpbnQgU0laRSA9IDIwOwpjbGFzcyBIZWFwIHsKcHJpdmF0ZToKICBpbnQgYXJyW1NJWkVdOwogIGludCBuOwoKICB2b2lkIGhlYXBVcChpbnQgY2hpbGQpOwogIHZvaWQgaGVhcERvd24oaW50IHBhcmVudCk7CiAgLy9jb252ZW5pZW5jZQogIGludCBsZWZ0KGludCBpKSB7IHJldHVybiAyICogaSArIDE7IH0KICBpbnQgcmlnaHQoaW50IGkpIHsgcmV0dXJuIDIgKiBpICsgMjsgfQogIGludCBwYXJlbnQoaW50IGkpIHsgcmV0dXJuIChpIC0gMSkgLyAyOyB9CgpwdWJsaWM6CiAgSGVhcCh2b2lkKTsKICB+SGVhcCh2b2lkKTsKCiAgdm9pZCBpbnNlcnQoaW50IHZhbHVlKTsKICBpbnQgcmVtb3ZlKCk7CiAgdm9pZCBwcmludCgpOwogIHZvaWQgc29ydCgpOwp9OwoKCgojaW5jbHVkZSAiSGVhcC5oIgoKSGVhcDo6SGVhcCh2b2lkKSB7IG4gPSAwOyB9CkhlYXA6On5IZWFwKHZvaWQpIHt9CnZvaWQgSGVhcDo6aW5zZXJ0KGludCB2YWx1ZSkgewogIGlmIChuID09IFNJWkUpCiAgICBleGl0KDEpOwogIGFycltuXSA9IHZhbHVlOwogIGhlYXBVcChuKyspOwp9CnZvaWQgSGVhcDo6aGVhcFVwKGludCBpKSB7CiAgaW50IHAgPSBwYXJlbnQoaSk7CiAgaWYgKGFycltpXSA+IGFycltwXSkgewogICAgc3dhcChhcnJbaV0sIGFycltwXSk7CiAgICBoZWFwVXAocCk7CiAgfQp9CmludCBIZWFwOjpyZW1vdmUoKSB7CiAgaWYgKG4gPT0gMCkKICAgIGV4aXQoMSk7CiAgaW50IHRlbXAgPSBhcnJbMF07CiAgYXJyWzBdID0gYXJyWy0tbl07CiAgaGVhcERvd24oMCk7CiAgYXJyW25dID0gMDsKICByZXR1cm4gdGVtcDsKfQp2b2lkIEhlYXA6OmhlYXBEb3duKGludCBpKSB7CiAgaW50IGwgPSBsZWZ0KGkpOwogIGludCByID0gcmlnaHQoaSk7CiAgLy8gY29tcGFyaW5nIHBhcmVudCB0byBsZWZ0L3JpZ2h0IGNoaWxkCiAgLy8gZWFjaCBoYXMgYW4gaW5uZXIgaWYgdG8gaGFuZGxlIGlmIHRoZSBmaXJzdCBzd2FwIGNhdXNlcyBhIHNlY29uZCBzd2FwCiAgLy8gIGllICAgIDEgICAtPiAgIDMgICAtPiAgIDUKICAvLyAgICAgIDMgICA1ICAgIDEgICA1ICAgIDEgICAzCiAgaWYgKGwgPCBuICYmIGFycltpXSA8IGFycltsXSkgewogICAgc3dhcChhcnJbaV0sIGFycltsXSk7CiAgICBoZWFwRG93bihsKTsKICAgIGlmIChyIDwgbiAmJiBhcnJbaV0gPCBhcnJbcl0pIHsKICAgICAgc3dhcChhcnJbaV0sIGFycltyXSk7CiAgICAgIGhlYXBEb3duKHIpOwogICAgfQogIH0gZWxzZSBpZiAociA8IG4gJiYgYXJyW2ldIDwgYXJyW3JdKSB7CiAgICBzd2FwKGFycltpXSwgYXJyW3JdKTsKICAgIGhlYXBEb3duKHIpOwogICAgaWYgKGwgPCBuICYmIGFycltpXSA8IGFycltsXSkgewogICAgICBzd2FwKGFycltpXSwgYXJyW2xdKTsKICAgICAgaGVhcERvd24obCk7CiAgICB9CiAgfQp9CnZvaWQgSGVhcDo6cHJpbnQoKSB7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgIGNvdXQgPDwgYXJyW2ldIDw8ICIgIjsKICB9CiAgY291dCA8PCBlbmRsOwp9Ci8vIGFkZGluZyBhIHByaW50IGluc2lkZSBzaW5jZSB0aGUgc29ydCBpdHNlbGYgZGVzdHJveXMgc2l6ZSBpbmNyZW1lbnRvcgp2b2lkIEhlYXA6OnNvcnQoKSB7CiAgaW50IHRlbXAgPSBuOwogIHdoaWxlIChuID4gMSkgewogICAgc3dhcChhcnJbLS1uXSwgYXJyWzBdKTsKICAgIGhlYXBEb3duKDApOwogIH0KICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXA7IGkrKykgewogICAgY291dCA8PCBhcnJbaV0gPDwgIiAiOwogIH0KICBjb3V0IDw8IGVuZGw7Cn0=