#include <iostream>
#include <vector>
using namespace std;

// Heapify for Min Heap
void heapify(vector<int>& arr, int n, int i)
{
    int smallest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n && arr[left] < arr[smallest])
        smallest = left;

    if (right < n && arr[right] < arr[smallest])
        smallest = right;

    if (smallest != i)
    {
        swap(arr[i], arr[smallest]);
        heapify(arr, n, smallest);
    }
}

// Build Min Heap
void buildMinHeap(vector<int>& arr)
{
    int n = arr.size();

    for (int i = n / 2 - 1; i >= 0; i--)
    {
        heapify(arr, n, i);
    }
}

// Heap Sort using Min Heap (Descending Order)
void heapSort(vector<int>& arr)
{
    int n = arr.size();

    // Step 1: Build Min Heap
    buildMinHeap(arr);

    // Step 2: Move smallest to the end repeatedly
    for (int i = n - 1; i > 0; i--)
    {
        swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
}

int main()
{
    vector<int> arr = {4, 10, 3, 5, 1};

    cout << "Original Array: ";
    for (int x : arr)
        cout << x << " ";

    cout << "\n";

    heapSort(arr);

    cout << "Sorted Array (Descending): ";
    for (int x : arr)
        cout << x << " ";

    return 0;
}