#define protected public #include using namespace std; using namespace chrono; using iii = int; using yeee = iii; #ifndef LOCAL const iii DEBUG = -1; #else const iii DEBUG = 10; #endif // #include // #include // using namespace __gnu_pbds; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; template using hash_map = gp_hash_table; #define DOUT(...) DOUTg(__LINE__, #__VA_ARGS__, __VA_ARGS__) #define JOE template void DOUTf(ostringstream &os, int names_i, vector &names, T1 &&val) { if(names[names_i].rfind("JOE ", 0) == string::npos) os << names[names_i] << " = "; os << val; } template void DOUTf(ostringstream &os, int names_i, vector &names, T1 &&val, Ts &&... vals) { DOUTf(os, names_i, names, val); os << " | "; DOUTf(os, names_i + 1, names, vals...); } template string DOUTg(int line_no, string names, Ts &&... vals) { string special = "()[]{}<>'\"\\"; vector vnames; vnames.push_back(""); vector stak; for(char c : names) { bool inside_string = !stak.empty() && (stak.back() == '\'' || stak.back() == '\"'); if(c == '\n') c = ' '; if(c == ' ' && (vnames.back().empty() || (!inside_string && vnames.back().back() == ' '))) continue; if(stak.empty() && c == ',') { if(!vnames.back().empty() && vnames.back().back() == ' ') vnames.back().pop_back(); vnames.push_back(""); continue; } vnames.back().push_back(c); if(!stak.empty() && stak.back() == '\\') { stak.pop_back(); continue; } size_t p = special.find(c); bool closing = p < 8 && p % 2; if(p == string::npos) continue; if(p == special.size() - 1) { stak.push_back(c); continue; } if(stak.empty()) { if(!closing) stak.push_back(c); continue; } if(inside_string) { if(c == stak.back()) stak.pop_back(); continue; } if(closing) { if(stak.back() == special[p - 1]) stak.pop_back(); continue; } stak.push_back(c); } ostringstream os; os << "/" << line_no << "/: "; DOUTf(os, 0, vnames, vals...); return os.str(); } template