#include <vector>

template <typename Value, typename Size>
auto initialize_vector(Value n, Size s) {
  return std::vector<Value>(s, n);
}

template <typename Value, typename Size, typename... Args>
auto initialize_vector(Value n, Size s, Args... dims) {
  auto vec = initialize_vector(n, dims...);
  return std::vector<Args>(s, vec);
}
template <typename T, typename Iter>
Iter find(const T& t, Iter st, Iter en, std::forward_iterator_tag) {
  Iter i;
  for (i = st; i != en; i++) {
    if (i == t) return i;
  }
  return en;
}

template <typename T, typename Iter>
Iter find(const T& t, Iter st, Iter en, std::bidirectional_iterator_tag) {
  Iter i;
  for (i = st; i != en; i++) {
    if (i == t) return i;
  }
  return en;
}

template <typename T, typename Iter>
Iter find(const T& t, Iter st, Iter en, std::random_access_iterator_tag) {
  Iter res = en;
  en--;
  while (st < en) {
    Iter mid = st + (en - st) / 2;

    if (mid < t) {
      st = mid + 1;
    } else {
      en = mid;
    }
  }
  if (st == t) {
    res = st;
  }
  return res;
}

template <typename T, typename Iter>
Iter Find(const T& t, Iter st, Iter en) {
  return find(t, st, en,
              typename std::iterator_traits<Iter>::iterator_category());
}