This documentation is automatically generated by online-judge-tools/verification-helper
#include "template/type_traits.hpp"
#pragma once
#include "macros.hpp"
#include <bits/stdc++.h>
template<class T, class... Args> struct function_traits_impl {
using result_type = T;
template<std::size_t idx>
using argument_type =
typename std::tuple_element<idx, std::tuple<Args...>>::type;
using argument_tuple = std::tuple<Args...>;
static constexpr std::size_t arg_size() { return sizeof...(Args); }
};
template<class> struct function_traits_helper;
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)&> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const&> {
using type = function_traits_impl<Res, Args...>;
};
#if __cpp_noexcept_function_type >= 201510L
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)& noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const& noexcept> {
using type = function_traits_impl<Res, Args...>;
};
#endif
template<class F>
using function_traits = typename function_traits_helper<
decltype(&std::remove_reference<F>::type::operator())>::type;
template<class F>
using function_result_type = typename function_traits<F>::result_type;
template<class F, std::size_t idx>
using function_argument_type =
typename function_traits<F>::template argument_type<idx>;
template<class F>
using function_argument_tuple = typename function_traits<F>::argument_tuple;
template<class T>
using is_signed_int =
std::integral_constant<bool, (std::is_integral<T>::value &&
std::is_signed<T>::value) ||
std::is_same<T, i128>::value>;
template<class T>
using is_unsigned_int =
std::integral_constant<bool, (std::is_integral<T>::value &&
std::is_unsigned<T>::value) ||
std::is_same<T, u128>::value>;
template<class T>
using is_int = std::integral_constant<bool, is_signed_int<T>::value ||
is_unsigned_int<T>::value>;
template<class T>
using make_signed_int = typename std::conditional<
std::is_same<T, i128>::value || std::is_same<T, u128>::value,
std::common_type<i128>, std::make_signed<T>>::type;
template<class T>
using make_unsigned_int = typename std::conditional<
std::is_same<T, i128>::value || std::is_same<T, u128>::value,
std::common_type<u128>, std::make_unsigned<T>>::type;
template<class T, class = void> struct is_range : std::false_type {};
template<class T>
struct is_range<
T,
decltype(all(std::declval<typename std::add_lvalue_reference<T>::type>()),
(void)0)> : std::true_type {};
template<class T, bool = is_range<T>::value>
struct range_rank : std::integral_constant<std::size_t, 0> {};
template<class T>
struct range_rank<T, true>
: std::integral_constant<std::size_t,
range_rank<typename T::value_type>::value + 1> {};
template<std::size_t size> struct int_least {
static_assert(size <= 128, "size must be less than or equal to 128");
using type = typename std::conditional<
size <= 8, std::int_least8_t,
typename std::conditional<
size <= 16, std::int_least16_t,
typename std::conditional<
size <= 32, std::int_least32_t,
typename std::conditional<size <= 64, std::int_least64_t,
i128>::type>::type>::type>::type;
};
template<std::size_t size> using int_least_t = typename int_least<size>::type;
template<std::size_t size> struct uint_least {
static_assert(size <= 128, "size must be less than or equal to 128");
using type = typename std::conditional<
size <= 8, std::uint_least8_t,
typename std::conditional<
size <= 16, std::uint_least16_t,
typename std::conditional<
size <= 32, std::uint_least32_t,
typename std::conditional<size <= 64, std::uint_least64_t,
u128>::type>::type>::type>::type;
};
template<std::size_t size> using uint_least_t = typename uint_least<size>::type;
template<class T>
using double_size_int = int_least<std::numeric_limits<T>::digits * 2 + 1>;
template<class T> using double_size_int_t = typename double_size_int<T>::type;
template<class T>
using double_size_uint = uint_least<std::numeric_limits<T>::digits * 2>;
template<class T> using double_size_uint_t = typename double_size_uint<T>::type;
template<class T>
using double_size =
typename std::conditional<is_signed_int<T>::value, double_size_int<T>,
double_size_uint<T>>::type;
template<class T> using double_size_t = typename double_size<T>::type;
#line 2 "template/type_traits.hpp"
#line 2 "template/macros.hpp"
#include <bits/stdc++.h>
#ifndef __COUNTER__
#define __COUNTER__ __LINE__
#endif
#define OVERLOAD5(a, b, c, d, e, ...) e
#define REP1_0(b, c) REP1_1(b, c)
#define REP1_1(b, c) \
for (ll REP_COUNTER_##c = 0; REP_COUNTER_##c < (ll)(b); ++REP_COUNTER_##c)
#define REP1(b) REP1_0(b, __COUNTER__)
#define REP2(i, b) for (ll i = 0; i < (ll)(b); ++i)
#define REP3(i, a, b) for (ll i = (ll)(a); i < (ll)(b); ++i)
#define REP4(i, a, b, c) for (ll i = (ll)(a); i < (ll)(b); i += (ll)(c))
#define rep(...) OVERLOAD5(__VA_ARGS__, REP4, REP3, REP2, REP1)(__VA_ARGS__)
#define RREP2(i, a) for (ll i = (ll)(a)-1; i >= 0; --i)
#define RREP3(i, a, b) for (ll i = (ll)(a)-1; i >= (ll)(b); --i)
#define RREP4(i, a, b, c) for (ll i = (ll)(a)-1; i >= (ll)(b); i -= (ll)(c))
#define rrep(...) OVERLOAD5(__VA_ARGS__, RREP4, RREP3, RREP2)(__VA_ARGS__)
#define REPS2(i, b) for (ll i = 1; i <= (ll)(b); ++i)
#define REPS3(i, a, b) for (ll i = (ll)(a) + 1; i <= (ll)(b); ++i)
#define REPS4(i, a, b, c) for (ll i = (ll)(a) + 1; i <= (ll)(b); i += (ll)(c))
#define reps(...) OVERLOAD5(__VA_ARGS__, REPS4, REPS3, REPS2)(__VA_ARGS__)
#define RREPS2(i, a) for (ll i = (ll)(a); i > 0; --i)
#define RREPS3(i, a, b) for (ll i = (ll)(a); i > (ll)(b); --i)
#define RREPS4(i, a, b, c) for (ll i = (ll)(a); i > (ll)(b); i -= (ll)(c))
#define rreps(...) OVERLOAD5(__VA_ARGS__, RREPS4, RREPS3, RREPS2)(__VA_ARGS__)
#define each_for(...) for (auto&& __VA_ARGS__)
#define each_const(...) for (const auto& __VA_ARGS__)
#define all(v) std::begin(v), std::end(v)
#define rall(v) std::rbegin(v), std::rend(v)
#if __cpp_if_constexpr >= 201606L
#define IF_CONSTEXPR constexpr
#else
#define IF_CONSTEXPR
#endif
#define IO_BUFFER_SIZE (1 << 17)
#line 5 "template/type_traits.hpp"
template<class T, class... Args> struct function_traits_impl {
using result_type = T;
template<std::size_t idx>
using argument_type =
typename std::tuple_element<idx, std::tuple<Args...>>::type;
using argument_tuple = std::tuple<Args...>;
static constexpr std::size_t arg_size() { return sizeof...(Args); }
};
template<class> struct function_traits_helper;
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)&> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const&> {
using type = function_traits_impl<Res, Args...>;
};
#if __cpp_noexcept_function_type >= 201510L
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...)& noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const noexcept> {
using type = function_traits_impl<Res, Args...>;
};
template<class Res, class Tp, class... Args>
struct function_traits_helper<Res (Tp::*)(Args...) const& noexcept> {
using type = function_traits_impl<Res, Args...>;
};
#endif
template<class F>
using function_traits = typename function_traits_helper<
decltype(&std::remove_reference<F>::type::operator())>::type;
template<class F>
using function_result_type = typename function_traits<F>::result_type;
template<class F, std::size_t idx>
using function_argument_type =
typename function_traits<F>::template argument_type<idx>;
template<class F>
using function_argument_tuple = typename function_traits<F>::argument_tuple;
template<class T>
using is_signed_int =
std::integral_constant<bool, (std::is_integral<T>::value &&
std::is_signed<T>::value) ||
std::is_same<T, i128>::value>;
template<class T>
using is_unsigned_int =
std::integral_constant<bool, (std::is_integral<T>::value &&
std::is_unsigned<T>::value) ||
std::is_same<T, u128>::value>;
template<class T>
using is_int = std::integral_constant<bool, is_signed_int<T>::value ||
is_unsigned_int<T>::value>;
template<class T>
using make_signed_int = typename std::conditional<
std::is_same<T, i128>::value || std::is_same<T, u128>::value,
std::common_type<i128>, std::make_signed<T>>::type;
template<class T>
using make_unsigned_int = typename std::conditional<
std::is_same<T, i128>::value || std::is_same<T, u128>::value,
std::common_type<u128>, std::make_unsigned<T>>::type;
template<class T, class = void> struct is_range : std::false_type {};
template<class T>
struct is_range<
T,
decltype(all(std::declval<typename std::add_lvalue_reference<T>::type>()),
(void)0)> : std::true_type {};
template<class T, bool = is_range<T>::value>
struct range_rank : std::integral_constant<std::size_t, 0> {};
template<class T>
struct range_rank<T, true>
: std::integral_constant<std::size_t,
range_rank<typename T::value_type>::value + 1> {};
template<std::size_t size> struct int_least {
static_assert(size <= 128, "size must be less than or equal to 128");
using type = typename std::conditional<
size <= 8, std::int_least8_t,
typename std::conditional<
size <= 16, std::int_least16_t,
typename std::conditional<
size <= 32, std::int_least32_t,
typename std::conditional<size <= 64, std::int_least64_t,
i128>::type>::type>::type>::type;
};
template<std::size_t size> using int_least_t = typename int_least<size>::type;
template<std::size_t size> struct uint_least {
static_assert(size <= 128, "size must be less than or equal to 128");
using type = typename std::conditional<
size <= 8, std::uint_least8_t,
typename std::conditional<
size <= 16, std::uint_least16_t,
typename std::conditional<
size <= 32, std::uint_least32_t,
typename std::conditional<size <= 64, std::uint_least64_t,
u128>::type>::type>::type>::type;
};
template<std::size_t size> using uint_least_t = typename uint_least<size>::type;
template<class T>
using double_size_int = int_least<std::numeric_limits<T>::digits * 2 + 1>;
template<class T> using double_size_int_t = typename double_size_int<T>::type;
template<class T>
using double_size_uint = uint_least<std::numeric_limits<T>::digits * 2>;
template<class T> using double_size_uint_t = typename double_size_uint<T>::type;
template<class T>
using double_size =
typename std::conditional<is_signed_int<T>::value, double_size_int<T>,
double_size_uint<T>>::type;
template<class T> using double_size_t = typename double_size<T>::type;