#include <algorithm>
template <typename T, typename Iterator, typename Category>
Iterator Search(const T& value, Iterator first, Iterator last,
Category) {
auto cur = first;
while (cur != last) {
if (*cur == value) {
break;
}
cur++;
}
return cur;
}
template <typename T, typename Iterator>
Iterator Search(const T& value, Iterator first, Iterator last,
std::random_access_iterator_tag) {
auto cur = std::lower_bound(first, last, value);
if (cur != last) {
if (*cur == value) {
return cur;
}
}
return last;
}
template <typename T, typename Iterator>
Iterator Find(const T& value, Iterator first, Iterator last) {
typedef typename std::iterator_traits<Iterator>::iterator_category category;
return Search(value, first, last, category());
}