#include <iterator> 

namespace cphstl {

template <typename I, typename E>
I find (
  I first,
  I one_past_the_end,
  const E& searched, 
  std::input_iterator_tag used_for_branching
) {

  for (I p = first; p != one_past_the_end; ++p) {
    if (*p == searched) {
      return p;
    }
  }
  return one_past_the_end;
}
  
template <typename I, typename E>
I find (
  I first, 
  I one_past_the_end, 
  const E& searched, 
  std::random_access_iterator_tag used_for_branching
) {

  typename std::iterator_traits<I>::difference_type count = one_past_the_end - first;
  I p = first;
  for ( ; count > 0; --count, ++p) {
    if (*p == searched) {
      return p;
    }
  }
  return one_past_the_end;
}

template <typename I, typename E>
I find(I first, I one_past_the_end, const E& searched) {
  
  typename std::iterator_traits<I>::iterator_category strength;
  return cphstl::find(first, one_past_the_end, searched, strength);
}

}

