namespace std { template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template<class Tuple, std::size_t... Is> string to_string_helper(const Tuple& t, std::index_sequence<Is...>) { return (((Is == 0? "(" : ", ") + to_string(std::get(t))) + ...) + ")"; } template<class... Args> string to_string(const std::tuple<Args...>& t) { return to_string_helper(t, std::index_sequence_for<Args...>{}); } template string to_string(const complex& c) { return "C" + to_string(make_pair(c.real(), c.imag())); } string to_string(const string& s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); }
string to_string(vector v) { bool first = true; string res = "{"; for (int i = 0; i < static_cast(v.size()); i++) { if (!first) { res += ", "; } first = false; res += to_string(v[i]); } res += "}"; return res; }
template string to_string(bitset v) { string res = ""; for (size_t i = 0; i < N; i++) { res += static_cast('0' + v[i]); } return res; }
template string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; }
void debug_out() { cerr << endl; } template<typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); }
ifdef LOCAL
define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: ", debug_out(__VA_ARGS__)
define tee(...) [](const auto& x){ cerr << "[" << #__VA_ARGS__ << "]: "; debug_out(x); return x; }(__VA_ARGS__)
else
define dbg(...) do {} while(0)
define tee(...) (__VA_ARGS__)
endif
}