#include <iterator>
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>) {
Iterator l = first;
Iterator r = last;
while (l < r) {
Iterator mid = l + (r - l) / 2;
if (value < *mid)
r = mid;
else {
l = mid + 1;
}
}
r -= 1;
if (*r == value)
return r;
return last;
}
else {
for (; first != last; ++first)
if (*first == value)
return first;
return last;
}
}