// Las entradas con las que se comparan los ordenamientos. Semilla fija: se repiten igual.
#ifndef INPUTS_H
#define INPUTS_H

#include <cstddef>
#include <numeric>
#include <random>
#include <utility>
#include <vector>

inline std::vector<int> sorted_input(std::size_t n) {
    std::vector<int> items(n);
    std::iota(items.begin(), items.end(), 0);
    return items;
}

inline std::vector<int> reversed_input(std::size_t n) {
    std::vector<int> items = sorted_input(n);
    for (std::size_t i = 0; i < n / 2; i++) {
        std::swap(items[i], items[n - 1 - i]);
    }
    return items;
}

// Fisher-Yates: el mismo orden con la misma semilla, en cualquier biblioteca.
inline std::vector<int> random_input(std::size_t n, unsigned seed) {
    std::vector<int> items = sorted_input(n);
    std::mt19937 rng(seed);
    for (std::size_t i = n; i > 1; i--) {
        std::swap(items[i - 1], items[rng() % i]);
    }
    return items;
}

// Solo `distinct` valores distintos, repetidos muchas veces.
inline std::vector<int> repeated_input(std::size_t n, int distinct, unsigned seed) {
    std::vector<int> items(n);
    std::mt19937 rng(seed);
    for (int& value : items) {
        value = static_cast<int>(rng() % static_cast<unsigned>(distinct));
    }
    return items;
}

#endif
