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