#include <type_traits>
#include <algorithm>
template <class T, class Iterator>
Iterator Find(const T& value, Iterator first, Iterator last) {
using tag = typename std::iterator_traits<Iterator>::iterator_category;
if constexpr (std::is_convertible_v<tag, std::random_access_iterator_tag>) {
auto i = std::lower_bound(first, last, value);
if (i != last && !(value < *i)) {
return i;
} else {
return last;
}
} else {
return std::find(first, last, value);
}
}