#pragma once

#include <algorithm>

template<typename T, typename Iterator>

Iterator Find(const T &value, Iterator first, Iterator last){
    using category = typename std::iterator_traits<Iterator>::iterator_category;
    if (std::is_same<std::random_access_iterator_tag, category>()){
        Iterator tmp = std::lower_bound(first, last, value);
        if (*tmp == value){
            return tmp;
        }
    }
    else{
        for (auto v = first; v != last; ++v){
            if (*v == value){
                return v;
            }
        }
    }
    return last;
}