#include template Iterator finds(const T &value, Iterator b, Iterator e, std::bidirectional_iterator_tag) { while (b != e) { if (*b == value) return b; else b++; } return e; } template Iterator finds(const T &value, Iterator b, Iterator e, std::random_access_iterator_tag) { Iterator l = b, r = e - 1, mid; while (l < r) { mid = (r - l) / 2 + l; if (*mid < value) l = mid + 1; else r = mid; } if (*l == value) return l; return e; } template Iterator Find(const T &value, Iterator first, Iterator last) { return finds(value, first, last, typename std::iterator_traits::iterator_category()); }