#include <iostream>
#include <optional>
#include <span>
#include <unordered_map>
#include <utility>
#include <vector>
std::optional<std::pair<std::size_t, std::size_t>> two_sum(std::span<const int> data, int target) {
    std::unordered_map<long long, std::size_t> seen;
    for (std::size_t i = 0; i < data.size(); ++i) {
        const long long needed = static_cast<long long>(target) - data[i];
        if (const auto it = seen.find(needed); it != seen.end()) return std::pair{it->second, i};
        seen.try_emplace(data[i], i);
    }
    return std::nullopt;
}
int main() {
    const std::vector<int> a{2, 7, 11}, duplicate{3, 3}, single{3}, none{1, 2};
    const auto result = two_sum(a, 9);
    if (!result || !two_sum(duplicate, 6) || two_sum(single, 6) || two_sum(none, 8)) return 1;
    std::cout << "indices=" << result->first << ',' << result->second << '\n';
}
