// Error a propósito: repite la medición siempre con los mismos datos.
#include <algorithm>
#include <cstddef>
#include <cstdio>
#include <initializer_list>
#include <random>
#include <vector>

#include "../bench.h"

std::vector<int> random_values(std::size_t n, std::mt19937& generator) {
    std::vector<int> values(n);
    for (int& value : values) {
        value = static_cast<int>(generator());
    }
    return values;
}

int main() {
    std::mt19937 generator(2026);
    const int reps = 200;
    std::printf("%8s %14s %14s\n", "n", "mismo (us)", "distintos (us)");
    for (std::size_t n : {1000u, 4000u, 16000u}) {
        // Primero 200 veces una copia del mismo arreglo.
        std::vector<int> original = random_values(n, generator);
        std::vector<std::vector<int>> copies(reps, original);
        std::size_t next = 0;
        double same = median_seconds(reps, [&] {
            std::sort(copies[next].begin(), copies[next].end());
            keep(copies[next]);
            next++;
        });

        // Después 200 arreglos distintos.
        std::vector<std::vector<int>> arrays;
        for (int i = 0; i < reps; i++) {
            arrays.push_back(random_values(n, generator));
        }
        next = 0;
        double different = median_seconds(reps, [&] {
            std::sort(arrays[next].begin(), arrays[next].end());
            keep(arrays[next]);
            next++;
        });
        std::printf("%8zu %14.1f %14.1f\n", n, same * 1e6, different * 1e6);
    }
    return 0;
}
