// El orden de std::string es el de los bytes. Consultas por rango sobre palabras.txt.
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <string>

int main(int argc, char** argv) {
    if (argc != 2) {
        std::cerr << "uso: byte_order palabras.txt\n";
        return 2;
    }
    std::ifstream file(argv[1]);
    if (!file) {
        std::cerr << "no se pudo abrir " << argv[1] << "\n";
        return 2;
    }
    std::map<std::string, int> words;
    std::string word;
    while (std::getline(file, word)) {
        words[word] = 1;
    }

    auto count_range = [&](const std::string& low, const std::string& high) {
        auto first = words.lower_bound(low);
        auto last = words.lower_bound(high);
        long count = std::distance(first, last);
        std::cout << "[" << low << ", " << high << "): " << count;
        if (count > 0) {
            std::cout << ", de " << first->first << " a " << std::prev(last)->first;
        }
        std::cout << "\n";
    };

    std::cout << "ultima: " << words.rbegin()->first << "\n";
    count_range("a", "b");
    count_range("á", "â");
    count_range("n", "o");
    count_range("ñ", "ò");
    count_range("pre", "prf");
    count_range("z", "{");

    auto next = words.upper_bound("zuzos");
    std::cout << "despues de zuzos: " << next->first << "\n";
    auto before = std::prev(words.lower_bound("rodillas"));
    std::cout << "piso de rodillas: " << before->first << ", siguiente: " << std::next(before)->first << "\n";
    return 0;
}
