// Mide la fuerza bruta de las inversiones con n y 2n. Se compila con -O2 y sin sanitizers.
// Cada fila es el menor de 3 tiempos. Los tiempos dependen de la máquina.
#include <chrono>
#include <cstddef>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>

#include "inversions_brute.h"

int main() {
    std::mt19937 rng(2);
    std::cout << "n       inversiones  tiempo ms  razón\n" << std::fixed;
    double previous = 0;
    for (std::size_t n : {10000u, 20000u, 40000u, 80000u, 160000u}) {
        std::vector<int> a(n);
        for (int& x : a) {
            x = static_cast<int>(rng() >> 1);
        }
        double best = 1e18;
        long long inversions = 0;
        for (int run = 0; run < 3; run++) {
            auto start = std::chrono::steady_clock::now();
            inversions = count_inversions_brute(a);
            auto end = std::chrono::steady_clock::now();
            best = std::min(best, std::chrono::duration<double, std::milli>(end - start).count());
        }
        std::cout << std::left << std::setw(8) << n << std::setw(13) << inversions << std::right << std::setw(9)
                  << std::setprecision(1) << best;
        if (previous > 0) {
            std::cout << std::setw(7) << std::setprecision(2) << best / previous;
        }
        std::cout << '\n';
        previous = best;
    }
}
