// Sigue mergesort sobre un arreglo: imprime cada mezcla en el orden en que ocurre.
#include <cstddef>
#include <iostream>
#include <vector>

#include "merge_sort.h"

static void print_range(const std::vector<int>& a, std::size_t lo, std::size_t hi) {
    for (std::size_t i = lo; i < hi; i++) {
        std::cout << (i == lo ? "" : " ") << a[i];
    }
}

static void traced_sort(std::vector<int>& a, std::vector<int>& buffer, std::size_t lo, std::size_t hi) {
    if (hi - lo <= 1) {
        return;
    }
    std::size_t mid = lo + (hi - lo) / 2;
    traced_sort(a, buffer, lo, mid);
    traced_sort(a, buffer, mid, hi);
    std::cout << "mezclar [" << lo << "," << mid << ") y [" << mid << "," << hi << "): ";
    print_range(a, lo, mid);
    std::cout << " | ";
    print_range(a, mid, hi);
    merge_ranges(a, buffer, lo, mid, hi);
    std::cout << " -> ";
    print_range(a, lo, hi);
    std::cout << '\n';
}

int main() {
    std::vector<int> a = {5, 2, 6, 1, 4, 3};
    std::vector<int> buffer(a.size());
    traced_sort(a, buffer, 0, a.size());
}
