#include template Iterator Find(const T& value, Iterator first, Iterator last) { using category = typename std::iterator_traits::iterator_category; if constexpr (std::is_same_v) { 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; } }