template<typename It>
inline double mean(It begin, It end)template<typename It>
double median(It begin, It end)template<typename It>
inline double variance(It begin, It end)template<typename It>
inline double standard_deviation(It begin, It end)template<typename It>
max_subarray_result<It> max_subarray_sum(It begin, It end)template<typename It>
struct max_subarray_result
{
It begin;
It end;
typename It::value_type sum;
};template<typename T>
class matrixexplicit matrix(std::size_t m, std::size_t n)template<typename Type, size_t M, size_t N>
explicit matrix(const Type(&mtx)[M][N]): m(M), n(N)row_holder operator[](std::size_t idx)const_row_holder operator[](std::size_t idx) constT determinant() consttemplate<typename RndIt1, typename RndIt2>
std::vector<RndIt1> longest_common_subsequence(RndIt1 first1, RndIt1 last1, RndIt2 first2, RndIt2 last2)template<typename RndIt1, typename RndIt2>
std::pair<RndIt1> longest_common_substring(RndIt1 first1, RndIt1 last1, RndIt2 first2, RndIt2 last2)template<typename RndIt>
std::vector<RndIt> longest_palindrome_subsequence(RndIt first, RndIt last)class thread_poolexplicit thread_pool(size_t t = std::thread::hardware_concurrency())template<typename Fn, typename ...Args>
void schedule(Fn fn, Args ...args) void schedule(task_package& p)bool is_busy()uint64_t executed_tasks() constuint64_t size() constuint64_t queue_length() constvoid release()void join()~thread_pool()template<typename Container>
class parallel_mapexplicit parallel_map(Container& target, thread_pool& pool): target(&target), pool(&pool) {}template<typename Fn, typename ...Args>
parallel_map& map(Fn fn, Args ...args)void run()void wrun()class task_packagetemplate<typename Fn, typename ...Args>
void append(Fn fn, Args ...args)void wait()bool completed() constclass timervoid start()uint64_t stop()uint64_t reset()template<typename Fn,
typename... Args,
typename = std::enable_if_t<has_return_type<Fn, Args...>::value>>
auto timing(const char *msg, std::ostream &os, Fn &&fn, Args &&... args)template<typename Fn,
typename... Args,
typename = std::enable_if_t<std::negation_v<std::bool_constant<has_return_type<Fn, Args...>::value>>>>
void timing(const char *msg, std::ostream &os, Fn &&fn, Args &&... args)void print_memory(const char* mem, size_t size, std::ostream& os, const PrintOptions& opt = { 16, true, true, '.' })struct PrintOptions
{
size_t width;
bool title;
bool ascii;
char no_ascii_placeholder;
};class random_iteratortemplate<typename ...Args>
explicit random_iterator(Args... args)random_iterator& operator++()random_iterator operator++(int)const T& operator*()template<typename T>
class random_stringexplicit random_string(const T& dict)T operator()(size_t length)static random_string hex();static random_string digits();static random_string alphabet();template<typename Iterator>
class utf8_iteratorutf8_iterator(Iterator it) : it(it) {}utf8_iterator& operator++()char32_t operator*()bool operator!=(Iterator r) consttemplate<typename It>
uint64_t levenshtein_distance(It first1, It last1, It first2, It last2, levenshtein_costs const &costs = {1, 1, 1})template<typename Container, typename T = typename Container::value_type>
std::istream& operator>>(std::istream& is, Container& x)template<typename Container, typename T = typename Container::value_type>
std::ostream& operator<<(std::ostream& os, const Container& x)template<typename T>
class queuetemplate<typename V>
void push(V &&val)void pop()T const &front() constT &front()T &back()T const &back() constbool empty() consttemplate<typename T, size_t N>
class fixed_queuebool enqueue(const T& value)T dequeue()inline bool empty() constinline bool full() constinline size_t capacity() constinline size_t size() consttemplate<typename T>
class threadsafe_queuevoid push(const T& val)T pop()std::optional<T> try_pop()bool empty() constsize_t size() consttemplate<typename T>
class threadsafe_priority_queuevoid push(const T& val)T pop()std::optional<T> try_pop()T& top()bool empty() constsize_t size() consttemplate<typename It1, typename It2, typename D>
void merge(It1 first1, It1 last1, It2 first2, It2 last2, D dest)template<typename It>
void merge(It first, It last)template<typename It>
It lomuto_partition(It first, It second, It pivot)template<typename It, typename P = std::function<It(It, It, It)>>
void quick_select(It first, It second, size_t k, P partition = &lomuto_partition<It>)template<typename T, typename Unit>
class prefixed_valuetemplate<typename To, typename T, typename U>
constexpr To prefixed_value_cast(prefixed_value<T, U> const &value)template<typename T1, typename U1, typename T2, typename U2>
constexpr bool operator==(prefixed_value<T1, U1> const &l, prefixed_value<T2, U2> const &r)template<typename T1, typename U1, typename T2, typename U2>
constexpr bool operator!=(prefixed_value<T1, U1> const &l, prefixed_value<T2, U2> const &r)template<typename T1, typename U1, typename T2, typename U2>
constexpr std::common_type_t<prefixed_value<T1, U1>, prefixed_value<T2, U2>> operator+(prefixed_value<T1, U1> const &l,
prefixed_value<T2, U2> const &r)template<typename T1, typename U1, typename T2, typename U2>
constexpr std::common_type_t<prefixed_value<T1, U1>, prefixed_value<T2, U2>> operator-(prefixed_value<T1, U1> const &l,
prefixed_value<T2, U2> const &r)template<typename T1, typename U1, typename T2, typename U2>
constexpr std::common_type_t<prefixed_value<T1, U1>, prefixed_value<T2, U2>> operator*(prefixed_value<T1, U1> const &l,
prefixed_value<T2, U2> const &r)template<typename T1, typename U1, typename T2, typename U2>
constexpr std::common_type_t<prefixed_value<T1, U1>, prefixed_value<T2, U2>> operator/(prefixed_value<T1, U1> const &l,
prefixed_value<T2, U2> const &r)template<typename T, typename Unit>
class distance : public literals::prefixed_value<T, Unit>template<typename T>
using km = distance<T, literals::unit<1000.l>>template<typename T>
using m = distance<T, literals::unit<1.l>>template<typename T>
using cm = distance<T, literals::unit<0.01l>>template<typename T>
using mm = distance<T, literals::unit<0.001l>>template<typename T>
using mile = distance<T, literals::unit<1609.344l>>km<int64_t> operator""_km(unsigned long long x)m<int64_t> operator""_m(unsigned long long x)cm<int64_t> operator""_cm(unsigned long long x)mm<int64_t> operator""_mm(unsigned long long x)mile<int64_t> operator""_mile(unsigned long long x)km<long double> operator""_km(long double x)m<long double> operator""_m(long double x)cm<long double> operator""_cm(long double x)mm<long double> operator""_mm(long double x)mile<long double> operator""_mile(long double x)