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