// Inversiones por fuerza bruta: las de unos arreglos chicos y, en cada nodo del árbol de mergesort,
// cuántas quedan dentro de cada mitad y cuántas cruzan.
#include <cstddef>
#include <iostream>
#include <vector>

#include "inversions_brute.h"

static void print_pairs(const std::vector<int>& a) {
    for (std::size_t i = 0; i < a.size(); i++) {
        std::cout << (i == 0 ? "" : " ") << a[i];
    }
    std::cout << ": " << count_inversions_brute(a) << " inversiones:";
    for (std::size_t i = 0; i < a.size(); i++) {
        for (std::size_t j = i + 1; j < a.size(); j++) {
            if (a[i] > a[j]) {
                std::cout << " (" << a[i] << "," << a[j] << ")";
            }
        }
    }
    std::cout << '\n';
}

static void print_node(const std::vector<int>& a, std::size_t lo, std::size_t hi) {
    if (hi - lo <= 1) {
        return;
    }
    std::size_t mid = lo + (hi - lo) / 2;
    std::cout << "[" << lo << "," << hi << ")  izquierda " << count_inversions_brute(a, lo, mid) << "  derecha "
              << count_inversions_brute(a, mid, hi) << "  cruzadas " << count_cross_brute(a, lo, mid, hi) << "  total "
              << count_inversions_brute(a, lo, hi) << '\n';
    print_node(a, lo, mid);
    print_node(a, mid, hi);
}

int main() {
    print_pairs({3, 1, 4, 2});
    print_pairs({1, 2, 3, 4});
    print_pairs({4, 3, 2, 1});
    std::cout << '\n';
    print_node({5, 2, 6, 1, 4, 3}, 0, 6);
}
