#include template Iterator FindTempl(const T &value, Iterator first, Iterator last, std::random_access_iterator_tag) { auto last_iter = last; --last; while (first < last) { Iterator m = (last - first) / 2 + first; if (*m < value) { first = m + 1; } else { last = m; } } if (*first == value) { return first; } return last_iter; } template Iterator FindTempl(const T &value, Iterator first, Iterator last, std::bidirectional_iterator_tag) { while (first != last) { if (*first == value) { return first; } ++first; } return last; } template Iterator Find(const T &value, Iterator first, Iterator last) { return FindTempl(value, first, last, typename std::iterator_traits::iterator_category()); }