// Enteros siempre ordenados. Un ejemplo de invariante que sí cuesta comprobar.
#ifndef SORTED_INTS_H
#define SORTED_INTS_H

#include <cassert>
#include <cstddef>
#include <vector>

// Invariante: items_[i - 1] <= items_[i] para todo i válido.
class SortedInts {
public:
    void insert(int value) {
        items_.push_back(value);
        std::size_t i = items_.size() - 1;
        while (i > 0 && items_[i - 1] > value) {
            items_[i] = items_[i - 1];
            i--;
        }
        items_[i] = value;
    }

    int smallest() const {
        assert(!items_.empty());
        return items_[0];
    }

    std::size_t size() const {
        return items_.size();
    }

    void check_invariants() const {
        for (std::size_t i = 1; i < items_.size(); i++) {
            assert(items_[i - 1] <= items_[i]);
        }
    }

private:
    std::vector<int> items_;
};

#endif
