// Error a propósito: al bajar, cambiar siempre con el hijo izquierdo, sin mirar cuál es el menor.
#include <cstddef>
#include <iostream>
#include <utility>
#include <vector>

namespace {

void sift_down_wrong(std::vector<int>& heap, std::size_t i) {
    while (2 * i + 1 < heap.size() && heap[2 * i + 1] < heap[i]) {
        std::swap(heap[i], heap[2 * i + 1]);
        i = 2 * i + 1;
    }
}

bool is_min_heap(const std::vector<int>& heap) {
    for (std::size_t i = 1; i < heap.size(); i++) {
        if (heap[(i - 1) / 2] > heap[i]) {
            return false;
        }
    }
    return true;
}

}  // namespace

int main() {
    std::vector<int> heap = {1, 4, 2, 5, 6, 3};
    std::cout << "antes de sacar: es heap: " << (is_min_heap(heap) ? "si" : "no") << "\n";
    heap[0] = heap.back();
    heap.pop_back();
    sift_down_wrong(heap, 0);
    std::cout << "arreglo:";
    for (int item : heap) {
        std::cout << " " << item;
    }
    std::cout << "\nraiz: " << heap[0] << ", es heap: " << (is_min_heap(heap) ? "si" : "no") << "\n";
    return 0;
}
