#include template auto initialize_vector(Value n, Size s) { return std::vector(s, n); } template auto initialize_vector(Value n, Size s, Args... dims) { auto vec = initialize_vector(n, dims...); return std::vector(s, vec); } template 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 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 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 Iter Find(const T& t, Iter st, Iter en) { return find(t, st, en, typename std::iterator_traits::iterator_category()); }