#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);
  }
}