#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());
}