// #define _GLIBCXX_DEBUG #include // clang-format off std::ostream&operator<<(std::ostream&os,std::int8_t x){return os<<(int)x;} std::ostream&operator<<(std::ostream&os,std::uint8_t x){return os<<(int)x;} std::ostream&operator<<(std::ostream&os,const __int128_t &u){if(!u)os<<"0";__int128_t tmp=u<0?(os<<"-",-u):u;std::string s;while(tmp)s+='0'+(tmp%10),tmp/=10;return std::reverse(s.begin(),s.end()),os< #define _LR(name, IT, CT) \ template struct name { \ using Iterator= typename std::vector::IT; \ Iterator bg, ed; \ Iterator begin() const { return bg; } \ Iterator end() const { return ed; } \ size_t size() const { return std::distance(bg, ed); } \ CT &operator[](int i) const { return bg[i]; } \ } _LR(ListRange, iterator, T); _LR(ConstListRange, const_iterator, const T); #undef _LR template struct CSRArray { std::vector dat; std::vector p; size_t size() const { return p.size() - 1; } ListRange operator[](int i) { return {dat.begin() + p[i], dat.begin() + p[i + 1]}; } ConstListRange operator[](int i) const { return {dat.cbegin() + p[i], dat.cbegin() + p[i + 1]}; } }; template