結果
問題 | No.2333 Slime Structure |
ユーザー |
|
提出日時 | 2023-05-28 15:13:18 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 182 ms / 3,000 ms |
コード長 | 43,701 bytes |
コンパイル時間 | 2,709 ms |
コンパイル使用メモリ | 218,868 KB |
最終ジャッジ日時 | 2025-02-13 12:41:36 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#line 2 "library/other/template.hpp"#include <bits/stdc++.h>#line 2 "library/template/macros.hpp"#line 4 "library/template/macros.hpp"#ifndef __COUNTER__#define __COUNTER__ __LINE__#endif#define REP_SELECTER(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(...) REP_SELECTER(__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(...) REP_SELECTER(__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(...) REP_SELECTER(__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(...) \REP_SELECTER(__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)#if __cplusplus >= 201402L#define rall(v) std::rbegin(v), std::rend(v)#else#define rall(v) v.rbegin(), v.rend()#endif#if __cpp_constexpr >= 201304L#define CONSTEXPR constexpr#else#define CONSTEXPR#endif#if __cpp_if_constexpr >= 201606L#define IF_CONSTEXPR constexpr#else#define IF_CONSTEXPR#endif#define IO_BUFFER_SIZE 2048#line 2 "library/template/alias.hpp"#line 4 "library/template/alias.hpp"using ll = long long;using ull = unsigned long long;using ld = long double;using PLL = std::pair<ll, ll>;template<class T>using prique = std::priority_queue<T, std::vector<T>, std::greater<T>>;template<class T> class infinity {public:static constexpr T value = std::numeric_limits<T>::max() / 2;static constexpr T mvalue = std::numeric_limits<T>::min() / 2;static constexpr T max = std::numeric_limits<T>::max();static constexpr T min = std::numeric_limits<T>::min();};#if __cplusplus <= 201402Ltemplate<class T> constexpr T infinity<T>::value;template<class T> constexpr T infinity<T>::mvalue;template<class T> constexpr T infinity<T>::max;template<class T> constexpr T infinity<T>::min;#endif#if __cpp_variable_templates >= 201304Ltemplate<class T> constexpr T INF = infinity<T>::value;#endifconstexpr ll inf = infinity<ll>::value;constexpr ld EPS = 1e-8;constexpr ld PI = 3.1415926535897932384626;#line 2 "library/template/type_traits.hpp"#line 5 "library/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 >= 201510Ltemplate<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...>;};#endiftemplate<class F>using function_traits =typename function_traits_helper<decltype(&F::operator())>::type;template<class T>using is_signed_int =std::disjunction<std::conjunction<std::is_integral<T>, std::is_signed<T>>,std::is_same<T, __int128_t>>;template<class T>using is_unsigned_int =std::disjunction<std::conjunction<std::is_integral<T>, std::is_unsigned<T>>,std::is_same<T, __uint128_t>>;template<class T>using is_int = std::disjunction<is_signed_int<T>, is_unsigned_int<T>>;template<class T>using make_signed_int = typename std::conditional<std::is_same<T, __int128_t>::value || std::is_same<T, __uint128_t>::value,std::common_type<__int128_t>, std::make_signed<T>>::type;template<class T>using make_unsigned_int = typename std::conditional<std::is_same<T, __int128_t>::value || std::is_same<T, __uint128_t>::value,std::common_type<__uint128_t>, 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,__int128_t>::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,__uint128_t>::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 "library/template/in.hpp"#line 4 "library/template/in.hpp"#include <unistd.h>#line 8 "library/template/in.hpp"template<std::size_t buf_size = IO_BUFFER_SIZE> class Reader {private:int fd, idx, sz;bool state;std::array<char, buf_size> buffer;inline void read_buf() {sz = read(fd, buffer.begin(), buf_size);idx = 0;if (sz < 0) throw std::runtime_error("input failed");}public:static constexpr int get_buf_size() { return buf_size; }Reader() noexcept : fd(0), idx(0), sz(0), state(true) {}Reader(int fd) noexcept : fd(fd), idx(0), sz(0), state(true) {}Reader(FILE* fp) noexcept : fd(fileno(fp)), idx(0), sz(0), state(true) {}class iterator {private:Reader* reader;public:using difference_type = void;using value_type = void;using pointer = void;using reference = void;using iterator_category = std::input_iterator_tag;iterator() : reader(nullptr) {}explicit iterator(Reader& reader) : reader(&reader) {}explicit iterator(Reader* reader) : reader(reader) {}iterator& operator++() {if (reader->idx == reader->sz) reader->read_buf();++reader->idx;return *this;}iterator operator++(int) {iterator res = *this;++(*this);return res;}char operator*() const {if (reader->idx == reader->sz) reader->read_buf();if (reader->idx < reader->sz) return reader->buffer[reader->idx];reader->state = false;return '\0';}bool rdstate() const { return reader->state; }};iterator begin() noexcept { return iterator(this); }};Reader<> reader(0);template<class Iterator, std::size_t decimal_precision = 16> class Scanner {public:using iterator_type = Iterator;private:template<class, class = void> struct has_scan : std::false_type {};template<class T>struct has_scan<T, decltype(std::declval<T>().scan(std::declval<Scanner&>()), (void)0)>: std::true_type {};Iterator itr;public:Scanner() = default;Scanner(const Iterator& itr) : itr(itr) {}char scan_char() {char c = *itr;++itr;return c;}Scanner ignore(int n = 1) {rep (n) ++itr;return *this;}inline void discard_space() {while (('\t' <= *itr && *itr <= '\r') || *itr == ' ') ++itr;}void scan(char& a) {discard_space();a = *itr;++itr;}void scan(bool& a) {discard_space();a = *itr != '0';++itr;}void scan(std::string& a) {discard_space();a.clear();while ((*itr < '\t' || '\r' < *itr) && *itr != ' ' && *itr != '\0') {a += *itr;++itr;}}template<std::size_t len> void scan(std::bitset<len>& a) {discard_space();rrep (i, len) {a[i] = *itr != '0';++itr;}}template<class T,typename std::enable_if<is_signed_int<T>::value &&!has_scan<T>::value>::type* = nullptr>void scan(T& a) {discard_space();if (*itr == '-') {++itr;a = 0;while ('0' <= *itr && *itr <= '9') {a = a * 10 - (*itr - '0');++itr;}}else {a = 0;while ('0' <= *itr && *itr <= '9') {a = a * 10 + (*itr - '0');++itr;}}}template<class T,typename std::enable_if<is_unsigned_int<T>::value &&!has_scan<T>::value>::type* = nullptr>void scan(T& a) {discard_space();a = 0;while ('0' <= *itr && *itr <= '9') {a = a * 10 + *itr - '0';++itr;}}template<class T,typename std::enable_if<std::is_floating_point<T>::value &&!has_scan<T>::value>::type* = nullptr>void scan(T& a) {discard_space();bool sgn = false;if (*itr == '-') {sgn = true;++itr;}a = 0;while ('0' <= *itr && *itr <= '9') {a = a * 10 + *itr - '0';++itr;}if (*itr == '.') {++itr;T n = 0, d = 1;for (int i = 0;'0' <= *itr && *itr <= '9' && i < (int)decimal_precision;++i) {n = n * 10 + *itr - '0';d *= 10;++itr;}while ('0' <= *itr && *itr <= '9') ++itr;a += n / d;}if (sgn) a = -a;}private:template<std::size_t i, class... Args> void scan(std::tuple<Args...>& a) {if IF_CONSTEXPR (i < sizeof...(Args)) {scan(std::get<i>(a));scan<i + 1, Args...>(a);}}public:template<class... Args> void scan(std::tuple<Args...>& a) {scan<0, Args...>(a);}template<class T, class U> void scan(std::pair<T, U>& a) {scan(a.first);scan(a.second);}template<class T,typename std::enable_if<is_range<T>::value &&!has_scan<T>::value>::type* = nullptr>void scan(T& a) {each_for (i : a) scan(i);}template<class T,typename std::enable_if<has_scan<T>::value>::type* = nullptr>void scan(T& a) {a.scan(*this);}void operator()() {}template<class Head, class... Args>void operator()(Head& head, Args&... args) {scan(head);operator()(args...);}template<class T> Scanner& operator>>(T& a) {scan(a);return *this;}explicit operator bool() const { return itr.rdstate(); }};Scanner<Reader<>::iterator> scan(reader.begin());template<class Iterator, std::size_t decimal_precision>Scanner<Iterator, decimal_precision>&getline(Scanner<Iterator, decimal_precision>& scan, std::string& a) {a.clear();char c;while ((c = scan.scan_char()) != '\n') {a += c;}return scan;}#line 2 "library/template/out.hpp"#line 8 "library/template/out.hpp"template<std::size_t buf_size = IO_BUFFER_SIZE> class Writer {private:int fd, idx;std::array<char, buf_size> buffer;inline void write_buf() {int num = write(fd, buffer.begin(), idx);idx = 0;if (num < 0) throw std::runtime_error("output failed");}public:Writer() noexcept : fd(1), idx(0) {}Writer(int fd) noexcept : fd(fd), idx(0) {}Writer(FILE* fp) noexcept : fd(fileno(fp)), idx(0) {}~Writer() { write_buf(); }class iterator {private:Writer* writer;public:using difference_type = void;using value_type = void;using pointer = void;using reference = void;using iterator_category = std::output_iterator_tag;iterator() noexcept : writer(nullptr) {}explicit iterator(Writer& writer) noexcept : writer(&writer) {}explicit iterator(Writer* writer) noexcept : writer(writer) {}iterator& operator++() {++writer->idx;if (writer->idx == buf_size) writer->write_buf();return *this;}iterator operator++(int) {iterator res = *this;++(*this);return res;}char& operator*() const { return writer->buffer[writer->idx]; }void flush() const { writer->write_buf(); }};iterator begin() noexcept { return iterator(this); }};Writer<> writer(1), ewriter(2);template<class Iterator, bool debug = false> class Printer {public:using iterator_type = Iterator;private:template<class, bool = debug, class = void>struct has_print : std::false_type {};template<class T>struct has_print<T, false,decltype(std::declval<T>().print(std::declval<Printer&>()),(void)0)> : std::true_type {};template<class T>struct has_print<T, true,decltype(std::declval<T>().debug(std::declval<Printer&>()),(void)0)> : std::true_type {};Iterator itr;std::size_t decimal_precision;public:void print_char(char c) {*itr = c;++itr;}void flush() { itr.flush(); }Printer() noexcept = default;explicit Printer(const Iterator& itr) noexcept: itr(itr), decimal_precision(16) {}void set_decimal_precision(std::size_t decimal_precision) {this->decimal_precision = decimal_precision;}void print(char c) {if IF_CONSTEXPR (debug) print_char('\'');print_char(c);if IF_CONSTEXPR (debug) print_char('\'');}void print(bool b) { print_char((char)(b + '0')); }void print(const char* a) {if IF_CONSTEXPR (debug) print_char('"');for (; *a != '\0'; ++a) print_char(*a);if IF_CONSTEXPR (debug) print_char('"');}template<std::size_t len> void print(const char (&a)[len]) {if IF_CONSTEXPR (debug) print_char('"');for (auto i : a) print_char(i);if IF_CONSTEXPR (debug) print_char('"');}void print(const std::string& a) {if IF_CONSTEXPR (debug) print_char('"');for (auto i : a) print_char(i);if IF_CONSTEXPR (debug) print_char('"');}template<std::size_t len> void print(const std::bitset<len>& a) {rrep (i, len) print_char((char)(a[i] + '0'));}template<class T,typename std::enable_if<is_int<T>::value &&!has_print<T>::value>::type* = nullptr>void print(T a) {if (!a) {print_char('0');return;}if IF_CONSTEXPR (is_signed_int<T>::value) {if (a < 0) {print_char('-');using U = typename make_unsigned_int<T>::type;print(static_cast<U>(-static_cast<U>(a)));return;}}std::string s;while (a) {s += (char)(a % 10 + '0');a /= 10;}for (auto i = s.rbegin(); i != s.rend(); ++i) print_char(*i);}template<class T,typename std::enable_if<std::is_floating_point<T>::value &&!has_print<T>::value>::type* = nullptr>void print(T a) {if (a == std::numeric_limits<T>::infinity()) {print("inf");return;}if (a == -std::numeric_limits<T>::infinity()) {print("-inf");return;}if (std::isnan(a)) {print("nan");return;}if (a < 0) {print_char('-');a = -a;}T b = a;if (b < 1) {print_char('0');}else {std::string s;while (b >= 1) {s += (char)('0' + (int)std::fmod(b, 10.0));b /= 10;}for (auto i = s.rbegin(); i != s.rend(); ++i) print_char(*i);}print_char('.');rep (decimal_precision) {a *= 10;print_char((char)('0' + (int)std::fmod(a, 10.0)));}}private:template<std::size_t i, class... Args>void print(const std::tuple<Args...>& a) {if IF_CONSTEXPR (i < sizeof...(Args)) {if IF_CONSTEXPR (debug) print_char(',');print_char(' ');print(std::get<i>(a));print<i + 1, Args...>(a);}}public:template<class... Args> void print(const std::tuple<Args...>& a) {if IF_CONSTEXPR (debug) print_char('(');if IF_CONSTEXPR (sizeof...(Args) != 0) print(std::get<0>(a));print<1, Args...>(a);if IF_CONSTEXPR (debug) print_char(')');}template<class T, class U> void print(const std::pair<T, U>& a) {if IF_CONSTEXPR (debug) print_char('(');print(a.first);if IF_CONSTEXPR (debug) print_char(',');print_char(' ');print(a.second);if IF_CONSTEXPR (debug) print_char(')');}template<class T,typename std::enable_if<is_range<T>::value &&!has_print<T>::value>::type* = nullptr>void print(const T& a) {if IF_CONSTEXPR (debug) print_char('{');for (auto i = std::begin(a); i != std::end(a); ++i) {if (i != std::begin(a)) {if IF_CONSTEXPR (debug) print_char(',');print_char(' ');}print(*i);}if IF_CONSTEXPR (debug) print_char('}');}template<class T, typename std::enable_if<has_print<T>::value &&!debug>::type* = nullptr>void print(const T& a) {a.print(*this);}template<class T, typename std::enable_if<has_print<T>::value &&debug>::type* = nullptr>void print(const T& a) {a.debug(*this);}void operator()() {}template<class Head, class... Args>void operator()(const Head& head, const Args&... args) {print(head);operator()(args...);}template<class T> Printer& operator<<(const T& a) {print(a);return *this;}Printer& operator<<(Printer& (*pf)(Printer&)) { return pf(*this); }};template<class Iterator, bool debug>Printer<Iterator, debug>& endl(Printer<Iterator, debug>& pr) {pr.print_char('\n');pr.flush();return pr;}template<class Iterator, bool debug>Printer<Iterator, debug>& flush(Printer<Iterator, debug>& pr) {pr.flush();return pr;}struct SetPrec {int n;template<class Pr> void print(Pr& pr) const { pr.set_decimal_precision(n); }template<class Pr> void debug(Pr& pr) const { pr.set_decimal_precision(n); }};SetPrec setprec(int n) { return SetPrec{n}; };Printer<Writer<>::iterator> print(writer.begin()), eprint(ewriter.begin());template<class T> auto prints(const T& v) -> decltype(print << v, (void)0) {print << v;print.print_char('\n');}template<class Head, class... Tail>auto prints(const Head& head, const Tail&... tail)-> decltype(print << head, (void)0) {print << head;print.print_char(' ');prints(tail...);}#ifdef SHIO_LOCALPrinter<Writer<>::iterator, true> debug(writer.begin()),edebug(ewriter.begin());#elsechar debug_iterator_character;class DebugIterator {public:DebugIterator() noexcept = default;DebugIterator& operator++() { return *this; }DebugIterator& operator++(int) { return *this; }char& operator*() const { return debug_iterator_character; }void flush() const {}};Printer<DebugIterator> debug, edebug;#endiftemplate<class T> auto debugs(const T& v) -> decltype(debug << v, (void)0) {debug << v;debug.print_char('\n');}template<class Head, class... Tail>auto debugs(const Head& head, const Tail&... tail)-> decltype(debug << head, (void)0) {debug << head;debug.print_char(' ');debugs(tail...);}#line 2 "library/template/bitop.hpp"#line 6 "library/template/bitop.hpp"namespace bitop {#define KTH_BIT(b, k) (((b) >> (k)) & 1)#define POW2(k) (1ull << (k))inline ull next_combination(int n, ull x) {if (n == 0) return 1;ull a = x & -x;ull b = x + a;return (x & ~b) / a >> 1 | b;}#define rep_comb(i, n, k) \for (ull i = (1ull << (k)) - 1; i < (1ull << (n)); \i = bitop::next_combination((n), i))inline CONSTEXPR int msb(ull x) {int res = x ? 0 : -1;if (x & 0xFFFFFFFF00000000) x &= 0xFFFFFFFF00000000, res += 32;if (x & 0xFFFF0000FFFF0000) x &= 0xFFFF0000FFFF0000, res += 16;if (x & 0xFF00FF00FF00FF00) x &= 0xFF00FF00FF00FF00, res += 8;if (x & 0xF0F0F0F0F0F0F0F0) x &= 0xF0F0F0F0F0F0F0F0, res += 4;if (x & 0xCCCCCCCCCCCCCCCC) x &= 0xCCCCCCCCCCCCCCCC, res += 2;return res + ((x & 0xAAAAAAAAAAAAAAAA) ? 1 : 0);}inline CONSTEXPR int ceil_log2(ull x) { return x ? msb(x - 1) + 1 : 0; }inline CONSTEXPR ull reverse(ull x) {x = ((x & 0xAAAAAAAAAAAAAAAA) >> 1) | ((x & 0x5555555555555555) << 1);x = ((x & 0xCCCCCCCCCCCCCCCC) >> 2) | ((x & 0x3333333333333333) << 2);x = ((x & 0xF0F0F0F0F0F0F0F0) >> 4) | ((x & 0x0F0F0F0F0F0F0F0F) << 4);x = ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8);x = ((x & 0xFFFF0000FFFF0000) >> 16) | ((x & 0x0000FFFF0000FFFF) << 16);return (x >> 32) | (x << 32);}inline CONSTEXPR ull reverse(ull x, int n) { return reverse(x) >> (64 - n); }} // namespace bitopinline CONSTEXPR int popcnt(ull x) noexcept {#if __cplusplus >= 202002Lreturn std::popcount(x);#endifx = (x & 0x5555555555555555) + ((x >> 1) & 0x5555555555555555);x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333);x = (x & 0x0f0f0f0f0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f0f0f0f0f);x = (x & 0x00ff00ff00ff00ff) + ((x >> 8) & 0x00ff00ff00ff00ff);x = (x & 0x0000ffff0000ffff) + ((x >> 16) & 0x0000ffff0000ffff);return (x & 0x00000000ffffffff) + ((x >> 32) & 0x00000000ffffffff);}#line 2 "library/template/func.hpp"#line 6 "library/template/func.hpp"template<class T, class U, class Comp = std::less<>>inline constexpr bool chmin(T& a, const U& b,Comp cmp = Comp()) noexcept(noexcept(cmp(b, a))) {return cmp(b, a) ? a = b, true : false;}template<class T, class U, class Comp = std::less<>>inline constexpr bool chmax(T& a, const U& b,Comp cmp = Comp()) noexcept(noexcept(cmp(a, b))) {return cmp(a, b) ? a = b, true : false;}inline CONSTEXPR ll gcd(ll a, ll b) noexcept {if (a < 0) a = -a;if (b < 0) b = -b;while (b) {const ll c = a;a = b;b = c % b;}return a;}inline CONSTEXPR ll lcm(ll a, ll b) noexcept { return a / gcd(a, b) * b; }inline CONSTEXPR bool is_prime(ll N) noexcept {if (N <= 1) return false;for (ll i = 2; i * i <= N; ++i) {if (N % i == 0) return false;}return true;}inline std::vector<ll> prime_factor(ll N) {std::vector<ll> res;for (ll i = 2; i * i <= N; ++i) {while (N % i == 0) {res.push_back(i);N /= i;}}if (N != 1) res.push_back(N);return res;}inline CONSTEXPR ll my_pow(ll a, ll b) noexcept {ll res = 1;while (b) {if (b & 1) res *= a;b >>= 1;a *= a;}return res;}inline CONSTEXPR ll mod_pow(ll a, ll b, ll mod) {assert(mod > 0);if (mod == 1) return 0;a %= mod;ll res = 1;while (b) {if (b & 1) (res *= a) %= mod;b >>= 1;(a *= a) %= mod;}return res;}inline PLL extGCD(ll a, ll b) {const ll n = a, m = b;ll x = 1, y = 0, u = 0, v = 1;ll t;while (b) {t = a / b;std::swap(a -= t * b, b);std::swap(x -= t * u, u);std::swap(y -= t * v, v);}if (x < 0) {x += m;y -= n;}return {x, y};}inline ll mod_inv(ll a, ll mod) {ll b = mod;ll x = 1, u = 0;ll t;while (b) {t = a / b;std::swap(a -= t * b, b);std::swap(x -= t * u, u);}if (x < 0) x += mod;assert(a == 1);return x;}#line 2 "library/template/util.hpp"#line 6 "library/template/util.hpp"template<class F> class RecLambda {private:F f;public:explicit constexpr RecLambda(F&& f_) : f(std::forward<F>(f_)) {}template<class... Args>constexpr auto operator()(Args&&... args)-> decltype(f(*this, std::forward<Args>(args)...)) {return f(*this, std::forward<Args>(args)...);}};template<class F> inline constexpr RecLambda<F> rec_lambda(F&& f) {return RecLambda<F>(std::forward<F>(f));}template<class Head, class... Tail> struct multi_dim_vector {using type = std::vector<typename multi_dim_vector<Tail...>::type>;};template<class T> struct multi_dim_vector<T> { using type = T; };template<class T, class Arg>constexpr std::vector<T> make_vec(int n, Arg&& arg) {return std::vector<T>(n, std::forward<Arg>(arg));}template<class T, class... Args>constexpr typename multi_dim_vector<Args..., T>::type make_vec(int n,Args&&... args) {return typename multi_dim_vector<Args..., T>::type(n, make_vec<T>(std::forward<Args>(args)...));}template<class T, class Comp = std::less<T>> class presser {private:std::vector<T> dat;Comp cmp;bool sorted = false;public:presser() : presser(Comp()) {}presser(const Comp& cmp) : cmp(cmp) {}presser(const std::vector<T>& vec, const Comp& cmp = Comp()): dat(vec), cmp(cmp) {}presser(std::vector<T>&& vec, const Comp& cmp = Comp()): dat(std::move(vec)), cmp(cmp) {}presser(std::initializer_list<T> il, const Comp& cmp = Comp()): dat(all(il)), cmp(cmp) {}void reserve(int n) {assert(!sorted);dat.reserve(n);}void push_back(const T& v) {assert(!sorted);dat.push_back(v);}void push_back(T&& v) {assert(!sorted);dat.push_back(std::move(v));}template<class... Args> void emplace_back(Args&&... args) {assert(!sorted);dat.emplace_back(std::forward<Args>(args)...);}void push(const std::vector<T>& vec) {assert(!sorted);const int n = dat.size();dat.resize(n + vec.size());rep (i, vec.size()) dat[n + i] = vec[i];}int build() {assert(!sorted);sorted = true;std::sort(all(dat), cmp);dat.erase(std::unique(all(dat),[&](const T& a, const T& b) -> bool {return !cmp(a, b) && !cmp(b, a);}),dat.end());return dat.size();}const T& operator[](int k) const& {assert(sorted);assert(0 <= k && k < (int)dat.size());return dat[k];}T operator[](int k) && {assert(sorted);assert(0 <= k && k < (int)dat.size());return std::move(dat[k]);}int get(const T& val) const {assert(sorted);auto itr = std::lower_bound(all(dat), val, cmp);assert(itr != dat.end() && !cmp(val, *itr));return itr - dat.begin();}int lower_bound(const T& val) const {assert(sorted);auto itr = std::lower_bound(all(dat), val, cmp);return itr - dat.begin();}int upper_bound(const T& val) const {assert(sorted);auto itr = std::upper_bound(all(dat), val, cmp);return itr - dat.begin();}bool contains(const T& val) const {assert(sorted);return std::binary_search(all(dat), val, cmp);}std::vector<int> pressed(const std::vector<T>& vec) const {assert(sorted);std::vector<int> res(vec.size());rep (i, vec.size()) res[i] = get(vec[i]);return res;}void press(std::vector<T>& vec) const {static_assert(std::is_convertible<T, int>::value,"template argument must be convertible from int type");assert(sorted);each_for (i : vec) i = get(i);}int size() const {assert(sorted);return dat.size();}const std::vector<T>& data() const& { return dat; }std::vector<T> data() && { return std::move(dat); }};#line 2 "library/data-struct/segment/SegmentTree.hpp"#line 2 "library/other/monoid.hpp"#line 4 "library/other/monoid.hpp"namespace Monoid {template<class M, class = void> class has_op : public std::false_type {};template<class M>class has_op<M, decltype((void)M::op)> : public std::true_type {};template<class M, class = void> class has_id : public std::false_type {};template<class M>class has_id<M, decltype((void)M::id)> : public std::true_type {};template<class M, class = void> class has_inv : public std::false_type {};template<class M>class has_inv<M, decltype((void)M::inv)> : public std::true_type {};template<class M, class = void> class has_get_inv : public std::false_type {};template<class M>class has_get_inv<M, decltype((void)M::get_inv)> : public std::true_type {};template<class M, class = void> class has_init : public std::false_type {};template<class M>class has_init<M, decltype((void)M::init(0, 0))> : public std::true_type {};template<class A, class = void> class has_mul_op : public std::false_type {};template<class A>class has_mul_op<A, decltype((void)A::mul_op)> : public std::true_type {};template<class T, class = void> class is_semigroup : public std::false_type {};template<class T>class is_semigroup<T, decltype(std::declval<typename T::value_type>(),(void)T::op)> : public std::true_type {};template<class T, class = void> class is_monoid : public std::false_type {};template<class T>class is_monoid<T, decltype(std::declval<typename T::value_type>(), (void)T::op,(void)T::id)> : public std::true_type {};template<class T, class = void> class is_group : public std::false_type {};template<class T>class is_group<T, decltype(std::declval<typename T::value_type>(), (void)T::op,(void)T::id, (void)T::get_inv)>: public std::true_type {};template<class T, class = void> class is_action : public std::false_type {};template<class T>class is_action<T, typename std::enable_if<is_monoid<typename T::M>::value &&is_semigroup<typename T::E>::value &&(has_op<T>::value ||has_mul_op<T>::value)>::type>: public std::true_type {};template<class T, class = void>class is_distributable_action : public std::false_type {};template<class T>class is_distributable_action<T,typename std::enable_if<is_action<T>::value && !has_mul_op<T>::value>::type>: public std::true_type {};template<class T> struct Sum {using value_type = T;static constexpr T op(const T& a, const T& b) { return a + b; }static constexpr T id() { return T{0}; }static constexpr T inv(const T& a, const T& b) { return a - b; }static constexpr T get_inv(const T& a) { return -a; }};template<class T, T max_value = infinity<T>::max> struct Min {using value_type = T;static constexpr T op(const T& a, const T& b) { return a < b ? a : b; }static constexpr T id() { return max_value; }};template<class T, T min_value = infinity<T>::min> struct Max {using value_type = T;static constexpr T op(const T& a, const T& b) { return a < b ? b : a; }static constexpr T id() { return min_value; }};template<class T> struct Assign {using value_type = T;static constexpr T op(const T&, const T& b) { return b; }};template<class T, T max_value = infinity<T>::max> struct AssignMin {using M = Min<T, max_value>;using E = Assign<T>;static constexpr T op(const T& a, const T&) { return a; }};template<class T, T min_value = infinity<T>::min> struct AssignMax {using M = Max<T, min_value>;using E = Assign<T>;static constexpr T op(const T& a, const T&) { return a; }};template<class T> struct AssignSum {using M = Sum<T>;using E = Assign<T>;static constexpr T mul_op(const T& a, int b, const T&) { return a * b; }};template<class T, T max_value = infinity<T>::max> struct AddMin {using M = Min<T, max_value>;using E = Sum<T>;static constexpr T op(const T& a, const T& b) { return b + a; }};template<class T, T min_value = infinity<T>::min> struct AddMax {using M = Max<T, min_value>;using E = Sum<T>;static constexpr T op(const T& a, const T& b) { return b + a; }};template<class T> struct AddSum {using M = Sum<T>;using E = Sum<T>;static constexpr T mul_op(const T& a, int b, const T& c) {return c + a * b;}};template<class T, T max_value = infinity<T>::max> struct ChminMin {using M = Min<T, max_value>;using E = Min<T>;static constexpr T op(const T& a, const T& b) { return std::min(b, a); }};template<class T, T min_value = infinity<T>::min> struct ChminMax {using M = Max<T, min_value>;using E = Min<T>;static constexpr T op(const T& a, const T& b) { return std::min(b, a); }};template<class T, T max_value = infinity<T>::max> struct ChmaxMin {using M = Min<T, max_value>;using E = Max<T>;static constexpr T op(const T& a, const T& b) { return std::max(b, a); }};template<class T, T min_value = infinity<T>::min> struct ChmaxMax {using M = Max<T, min_value>;using E = Max<T>;static constexpr T op(const T& a, const T& b) { return std::max(b, a); }};template<class M> struct ReverseMonoid {using value_type = typename M::value_type;static value_type op(const value_type& a, const value_type& b) {return M::op(b, a);}static value_type id() {static_assert(has_id<M>::value, "id is not defined");return M::id();}static value_type get_inv(const value_type& a) {static_assert(has_get_inv<M>::value, "get_inv is not defined");return M::get_inv(a);}};template<class M_> struct AttachEffector {using M = M_;using E = M_;using T = typename M_::value_type;static T op(const T& a, const T& b) { return M_::op(b, a); }};template<class E_> struct AttachMonoid {using M = E_;using E = E_;using T = typename E_::value_type;static T op(const T& a, const T& b) { return E_::op(b, a); }};} // namespace Monoid#line 5 "library/data-struct/segment/SegmentTree.hpp"template<class M> class SegmentTree {private:using T = typename M::value_type;int n, ori;std::vector<T> data;public:SegmentTree() : SegmentTree(0) {}SegmentTree(int n) : SegmentTree(std::vector<T>(n, M::id())) {}SegmentTree(int n, const T& v) : SegmentTree(std::vector<T>(n, v)) {}SegmentTree(const std::vector<T>& v) { init(v); }void init(const std::vector<T>& v) {ori = v.size();n = 1 << bitop::ceil_log2(ori);data.assign(n << 1, M::id());rep (i, ori) data[n + i] = v[i];rrep (i, n, 1) data[i] = M::op(data[i << 1], data[i << 1 ^ 1]);}template<class Upd> void update(int k, const Upd& upd) {assert(0 <= k && k < ori);k += n;data[k] = upd(data[k]);while (k >>= 1) data[k] = M::op(data[k << 1], data[k << 1 ^ 1]);}void set(int k, T x) {update(k, [&](T) -> T { return x; });}void apply(int k, T x) {update(k, [&](T a) -> T { return M::op(a, x); });}T prod(int l, int r) const {assert(0 <= l && l <= r && r <= ori);l += n;r += n;T lsm = M::id(), rsm = M::id();while (l < r) {if (l & 1) lsm = M::op(lsm, data[l++]);if (r & 1) rsm = M::op(data[--r], rsm);l >>= 1;r >>= 1;}return M::op(lsm, rsm);}T all_prod() const { return data[1]; }T get(int k) const { return data[k + n]; }template<class Cond> int max_right(int l, const Cond& cond) const {assert(0 <= l && l <= ori);assert(cond(M::id()));if (l == ori) return ori;l += n;T sm = M::id();do {while ((l & 1) == 0) l >>= 1;if (!cond(M::op(sm, data[l]))) {while (l < n) {l <<= 1;if (cond(M::op(sm, data[l]))) sm = M::op(sm, data[l++]);}return l - n;}sm = M::op(sm, data[l++]);} while ((l & -l) != l);return ori;}template<class Cond> int min_left(int r, const Cond& cond) const {assert(0 <= r && r <= ori);assert(cond(M::id()));if (r == 0) return 0;r += n;T sm = M::id();do {--r;while ((r & 1) && r > 1) r >>= 1;if (!cond(M::op(data[r], sm))) {while (r < n) {r = r << 1 ^ 1;if (cond(M::op(data[r], sm))) sm = M::op(data[r--], sm);}return r + 1 - n;}sm = M::op(data[r], sm);} while ((r & -r) != r);return 0;}};// verified with test/aoj/DSL/DSL_2_A-RMQ.test.cpptemplate<class T, T max_value = infinity<T>::max>using RangeMinimumQuery = SegmentTree<Monoid::Min<T, max_value>>;template<class T, T min_value = infinity<T>::min>using RangeMaximumQuery = SegmentTree<Monoid::Max<T, min_value>>;// verified with test/aoj/DSL/DSL_2_B-RSQ.test.cpptemplate<class T> using RangeSumQuery = SegmentTree<Monoid::Sum<T>>;/*** @brief SegmentTree(セグメント木)* @docs docs/data-struct/segment/SegmentTree.md*/#line 3 "main.cpp"using namespace std;struct Subsum {struct value_type {ll mx1; // 長さ 1 以上の prefix sum の maxll mx2; // 長さ 1 以上の suffix sum の maxll sm; // sumll ans; // この中での max};static value_type op(const value_type& a, const value_type& b) {return {max(a.mx1, a.sm + b.mx1),max(b.mx2, b.sm + a.mx2),a.sm + b.sm,max({a.ans, b.ans, a.mx2 + b.mx1})};}static value_type id() {return {-inf, -inf, 0, -inf};}};int main() {int N; scan >> N;vector<PLL> A(N); scan >> A;int Q; scan >> Q;vector<array<ll, 3>> B(Q); scan >> B;presser<ll> ps;vector<ll> R(N + 1);rep (i, N) R[i + 1] = R[i] + A[i].second;ps.push(R);rep (i, Q) {if (B[i][0] == 1) {--B[i][1];ps.push_back(B[i][1]);ps.push_back(B[i][1] + 1);}else {--B[i][1];ps.push_back(B[i][1]);ps.push_back(B[i][2]);}}ps.build();SegmentTree<Subsum> seg([&]{vector<typename Subsum::value_type> C(ps.size() - 1);rep (i, ps.size() - 1) {ll len = ps[i + 1] - ps[i];ll val = A[upper_bound(all(R), ps[i]) - R.begin() - 1].first;C[i] = {max(val, val * len), max(val, val * len), val * len, max(val, val * len)};}return C;}());for (auto [t, a, b] : B) {if (t == 1) {seg.set(ps.get(a), {b, b, b, b});}else {prints(seg.prod(ps.get(a), ps.get(b)).ans);}}}