template<typename T, typename Iterator>
Iterator Find(const T& value, Iterator first, Iterator last) {
using category = typename std::iterator_traits<Iterator>::iterator_category;
if constexpr (std::is_same_v<category, std::random_access_iterator_tag>) {
auto it = std::lower_bound(first, last, value);
if (*it == value) {return it;} else {return last;}
} else {return std::find(first, last, value);}
}