Advertisement
t_naveen_2308

Complete C++ Template

Jan 20th, 2025 (edited)
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 47.73 KB | None | 0 0
  1. // Author : Naveen
  2. // Program Start
  3. // Libraries and Namespace Start
  4. #include <bits/stdc++.h>
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <ext/pb_ds/tree_policy.hpp>
  7. using namespace std;
  8. using namespace __gnu_pbds;
  9. // Libraries and Namespace End
  10.  
  11. //------------------------------------------------------------------------------------------
  12.  
  13. // Important Shortcuts Start
  14. // Macros Start
  15. #define F first
  16. #define S second
  17. #define pb push_back
  18. #define yes cout << "yes\n"
  19. #define no cout << "no\n"
  20. #define Yes cout << "Yes\n"
  21. #define No cout << "No\n"
  22. #define YES cout << "YES\n"
  23. #define NO cout << "NO\n"
  24. #define fri(i, s, e) for (ll i = s; i < e; ++i)
  25. #define frd(i, e, s) for(ll i = e; i > s; --i)
  26. #define all(v) v.begin(), v.end()
  27. // Macros End
  28.  
  29. // Custom Hash Function Start
  30. struct custom_hash {
  31.     static uint64_t splitMix64(uint64_t x) {
  32.         x += 0x9e3779b97f4a7c15;
  33.         x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
  34.         x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
  35.         return x ^ (x >> 31);
  36.     }
  37.     size_t operator()(uint64_t x) const {
  38.         static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
  39.         return splitMix64(x + FIXED_RANDOM);
  40.     }
  41. };
  42. // Custom Hash Function End
  43.  
  44. // Declarations Start
  45. typedef bool bl;
  46. typedef long long int ll;
  47. typedef unsigned long long int ull;
  48. typedef long double ld;
  49. typedef string str;
  50. typedef pair<ll, ll> prll;
  51. typedef tuple<ll, ll, ll> tupll;
  52. typedef stack<ll> stkll;
  53. typedef queue<ll> quell;
  54. typedef vector<bl> vecbl;
  55. typedef vector<ll> vecll;
  56. typedef vector<prll> vecprll;
  57. typedef vector<tupll> vectupll;
  58. typedef vector<ld> vecld;
  59. typedef set<ll> setll;
  60. typedef multiset<ll> mltsetll;
  61. typedef map<ll, ll> mapll;
  62. typedef multimap<ll, ll> mltmapll;
  63. // Declarations End
  64.  
  65. // Using Declarations Start
  66. template <typename T>
  67. using unord_set = unordered_set<T, custom_hash>;
  68. typedef unord_set<ll> unsetll;
  69.  
  70. template <typename T>
  71. using unord_multiset = unordered_multiset<T, custom_hash>;
  72. typedef unord_multiset<ll> unmltsetll;
  73.  
  74. template <typename T1, typename T2>
  75. using unord_map = unordered_map<T1, T2, custom_hash>;
  76. typedef unord_map<ll, ll> unmapll;
  77.  
  78. template <typename T1, typename T2>
  79. using unord_multimap = unordered_multimap<T1, T2, custom_hash>;
  80. typedef unord_multimap<ll, ll> unmltmapll;
  81.  
  82. template <typename T, typename Compare = greater<T>>
  83. using heap = priority_queue<T, vector<T>, Compare>;
  84. typedef heap<ll> minheapll;
  85. typedef heap<prll> minheapprll;
  86. typedef heap<ll, less<ll>> maxheapll;
  87. typedef heap<prll, less<prll>> maxheapprll;
  88.  
  89. template <typename T, typename Compare = less<T>>
  90. using pbds_tree = tree<T, null_type, Compare, rb_tree_tag, tree_order_statistics_node_update>;
  91. typedef pbds_tree<ll> pbdssetll;
  92. typedef pbds_tree<ll, less_equal<ll>> pbdsmltsetll;
  93. typedef pbds_tree<prll> pbdsmapll;
  94. typedef pbds_tree<prll, less_equal<prll>> pbdsmltmapll;
  95. // Using Declarations End
  96. // Important Shortcuts End
  97.  
  98. //------------------------------------------------------------------------------------------
  99.  
  100. // Important Functions Start
  101. // Constants Start
  102. const ll inf = 9223372036854775807ll;
  103. const ll neg_inf = -9223372036854775807ll - 1ll;
  104. const ll mod1 = 1000000007ll;
  105. const ll mod2 = 998244353ll;
  106. const ll max_if = 200000ll;
  107. const ll one = 1ll;
  108. const ll zero = 0ll;
  109. const str spc = " ";
  110. const str emp = "";
  111. const str newl = "\n";
  112. // Constants End
  113.  
  114. // Input and Output Functions Start
  115. template <class U, class T, class S>
  116. U& operator>>(U& is, pair<T, T>& a) {
  117.     return is >> a.first >> a.second;
  118. }
  119. template <class U, class T>
  120. U& operator>>(U& is, vector<T>& a) {
  121.     for (T& x : a) {
  122.         is >> x;
  123.     }
  124.     return is;
  125. }
  126.  
  127. template <class U, class T>
  128. U& operator<<(U& os, vector<T>& a) {
  129.     for (ll i = 0;i < a.size();++i) {
  130.         os << a[i] << (i != a.size() - 1 ? spc : emp);
  131.     }
  132.     return os;
  133. }
  134.  
  135. inline void yn(const bool con) {
  136.     cout << (con ? "yes" : "no") << '\n';
  137. }
  138. inline void Yn(const bool con) {
  139.     cout << (con ? "Yes" : "No") << '\n';
  140. }
  141. inline void YN(const bool con) {
  142.     cout << (con ? "YES" : "NO") << '\n';
  143. }
  144. // Input and Output Functions End
  145.  
  146. // Debug Functions Start
  147. template<class T>
  148. void debug(const T v) {
  149.     cerr << v;
  150. }
  151.  
  152. template <class T, class V>
  153. void debug(const pair<T, V>& p) {
  154.     cerr << "(";
  155.     debug(p.first);
  156.     cerr << ", ";
  157.     debug(p.second);
  158.     cerr << ")";
  159. }
  160.  
  161. template <size_t Index, typename... lls>
  162. typename enable_if<Index == sizeof...(lls)>::type
  163. print_tuple(ostream& os, const tuple<lls...>&) {}
  164.  
  165. template <size_t Index, typename... lls>
  166. typename enable_if < Index<sizeof...(lls)>::type
  167.     print_tuple(ostream& os, const tuple<lls...>& t) {
  168.     os << get<Index>(t);
  169.     if (Index + 1 < sizeof...(lls)) os << ", ";
  170.     print_tuple<Index + 1>(os, t);
  171. }
  172.  
  173.  
  174. template <typename... lls>
  175. void debug(const tuple<lls...>& t) {
  176.     cerr << "(";
  177.     print_tuple<0>(cerr, t);
  178.     cerr << ")";
  179. }
  180.  
  181. template <class T>
  182. void debug(const vector<T>& vec) {
  183.     size_t c = 0;
  184.     const size_t n = vec.size();
  185.     cerr << "[";
  186.     for (T i : vec) {
  187.         debug(i);
  188.         cerr << (++c < n ? ", " : "");
  189.     }
  190.     cerr << "]\n";
  191. }
  192.  
  193. template <class T>
  194. void debug(const set<T>& set_v) {
  195.     size_t c = 0;
  196.     const size_t n = set_v.size();
  197.     cerr << "{";
  198.     for (T i : set_v) {
  199.         debug(i);
  200.         cerr << (++c < n ? ", " : "");
  201.     }
  202.     cerr << "}";
  203. }
  204.  
  205. template <class T>
  206. void debug(const unordered_set<T>& set_v) {
  207.     size_t c = 0;
  208.     const size_t n = set_v.size();
  209.     cerr << "{";
  210.     for (T i : set_v) {
  211.         debug(i);
  212.         cerr << (++c < n ? ", " : "");
  213.     }
  214.     cerr << "}";
  215. }
  216.  
  217. template <class T>
  218. void debug(const multiset<T>& set_v) {
  219.     size_t c = 0;
  220.     const size_t n = set_v.size();
  221.     cerr << "{";
  222.     for (T i : set_v) {
  223.         debug(i);
  224.         cerr << (++c < n ? ", " : "");
  225.     }
  226.     cerr << "}";
  227. }
  228.  
  229. template <class T>
  230. void debug(const unordered_multiset<T>& set_v) {
  231.     size_t c = 0;
  232.     const size_t n = set_v.size();
  233.     cerr << "{";
  234.     for (T i : set_v) {
  235.         debug(i);
  236.         cerr << (++c < n ? ", " : "");
  237.     }
  238.     cerr << "}";
  239. }
  240.  
  241. template <typename T, typename Compare = less<T>>
  242. void debug(const pbds_tree<T, Compare>& set_v) {
  243.     size_t c = 0;
  244.     const size_t n = set_v.size();
  245.     cerr << "{";
  246.     for (T i : set_v) {
  247.         debug(i);
  248.         cerr << (++c < n ? ", " : "");
  249.     }
  250.     cerr << "}";
  251. }
  252.  
  253. template <class T, class V>
  254. void debug(const map<T, V>& dict) {
  255.     size_t c = 0;
  256.     const size_t n = dict.size();
  257.     cerr << "{";
  258.     for (auto it : dict) {
  259.         debug(it.first);
  260.         cerr << ": ";
  261.         debug(it.second);
  262.         cerr << (++c < n ? ", " : "");
  263.     }
  264.     cerr << "}";
  265. }
  266.  
  267. template <class T, class V>
  268. void debug(const multimap<T, V>& dict) {
  269.     size_t c = 0;
  270.     const size_t n = dict.size();
  271.     cerr << "{";
  272.     for (auto it : dict) {
  273.         debug(it.first);
  274.         cerr << ": ";
  275.         debug(it.second);
  276.         cerr << (++c < n ? ", " : "");
  277.     }
  278.     cerr << "}";
  279. }
  280.  
  281. template <class T, class V>
  282. void debug(const unordered_map<T, V>& dict) {
  283.     size_t c = 0;
  284.     const size_t n = dict.size();
  285.     cerr << "{";
  286.     for (auto it : dict) {
  287.         debug(it.first);
  288.         cerr << ": ";
  289.         debug(it.second);
  290.         cerr << (++c < n ? ", " : "");
  291.     }
  292.     cerr << "}";
  293. }
  294.  
  295. template <class T, class V>
  296. void debug(const unordered_multimap<T, V>& dict) {
  297.     size_t c = 0;
  298.     const size_t n = dict.size();
  299.     cerr << "{";
  300.     for (auto it : dict) {
  301.         debug(it.first);
  302.         cerr << ": ";
  303.         debug(it.second);
  304.         cerr << (++c < n ? ", " : "");
  305.     }
  306.     cerr << "}";
  307. }
  308.  
  309. template <typename T, typename... Args>
  310. void debug(const T& v, const Args&... args) {
  311.     debug(v);
  312.     debug(args...);
  313. }
  314. // Debug Functions End
  315. // Important Functions End
  316.  
  317. //------------------------------------------------------------------------------------------
  318.  
  319. // Basic Functions Start
  320. // String Operator Overload Start
  321. template <class T>
  322. str operator*(const str& s, const T& n) {
  323.     str res;
  324.     res.reserve(s.size() * n);
  325.     for (ll i = 0; i < n; ++i) res += s;
  326.     return res;
  327. }
  328. // String Operator Overload End
  329.  
  330. //Binary Search Start
  331. template <typename T>
  332. inline ll bin_search(const vector<T>& v, T x) {
  333.     auto it = lower_bound(v.begin(), v.end(), x);
  334.     if (it != v.end() && *it == x) return distance(v.begin(), it);
  335.     return -1;
  336. }
  337. // Binary Search End
  338.  
  339. // Min Function Start
  340. template <class T>
  341. inline T min(const vector<T>& vec) {
  342.     assert(vec.size() >= 1 && "Cannot find minimum of an empty vector.");
  343.     return *min_element(vec.begin(), vec.end());
  344. }
  345. // Min Function End
  346.  
  347. // Max Function Start
  348. template <class T>
  349. inline T max(const vector<T>& vec) {
  350.     assert(vec.size() >= 1 && "Cannot find minimum of an empty vector.");
  351.     return *max_element(vec.begin(), vec.end());
  352. }
  353. // Max Function End
  354.  
  355. // Sum Function Start
  356. template <class T>
  357. inline T sum(T v) {
  358.     return v;
  359. }
  360. template <class T>
  361. inline T sum(T v1, T v2) {
  362.     return v1 + v2;
  363. }
  364. template <class T>
  365. T sum(const initializer_list<T>& ilist) {
  366.     T sumi = T();
  367.     for (const T& val : ilist) sumi += val;
  368.     return sumi;
  369. }
  370. template <class T>
  371. T sum(const vector<T>& vec) {
  372.     T sumi = T();
  373.     for (auto i : vec) sumi += sum(i);
  374.     return sumi;
  375. }
  376. template <class T>
  377. T sum(const set<T>& seti) {
  378.     T sumi = T();
  379.     for (auto i : seti) sumi += sum(i);
  380.     return sumi;
  381. }
  382. template <class T>
  383. T sum(const multiset<T>& seti) {
  384.     T sumi = T();
  385.     for (auto i : seti) sumi += sum(i);
  386.     return sumi;
  387. }
  388. template <typename T, typename Compare = less<T>>
  389. T sum(const pbds_tree<T, Compare>& seti) {
  390.     T sumi = T();
  391.     for (auto i : seti) sumi += sum(i);
  392.     return sumi;
  393. }
  394. // Sum Function End
  395.  
  396. // Binary Start
  397. template <class T>
  398. str bin(const T& dn) {
  399.     str bin_str = bitset<64>(dn).to_string();
  400.     ll firstOne = bin_str.find('1');
  401.     if (firstOne != str::npos) {
  402.         bin_str = bin_str.substr(firstOne);
  403.         return bin_str;
  404.     }
  405.     return "0";
  406. }
  407.  
  408. ll int2(const str& bin_str) {
  409.     bitset<64> bits(bin_str);
  410.     ll dn = static_cast<ll>(bits.to_ulong());
  411.     return dn;
  412. }
  413. // Binary End
  414.  
  415. // Square Root Start
  416. inline ll sqrt_int(ll n) {
  417.     assert(n >= 0 && "The number can't be negative.");
  418.     return static_cast<ll>(sqrt(n));
  419. }
  420.  
  421. ll sqrt_int_u(ll n) {
  422.     assert(n >= 0 && "The number can't be negative.");
  423.     ll k = sqrt(n);
  424.     return k * k == n ? k : k + 1;
  425. }
  426. // Square Root End
  427.  
  428. // Map Computation Start
  429. template <class T>
  430. void map_com(map<T, ll>& ma, const vector<T>& vec) {
  431.     for (T i : vec) ma[i]++;
  432. }
  433. // Map Computation End
  434. // Basic Functions End
  435.  
  436. //------------------------------------------------------------------------------------------
  437.  
  438. // Algorithms Start
  439. // Power Function Start
  440. ll power(ll a, ll b, const ll mod = mod1) {
  441.     assert(b >= 0 && "Power cannot be negative.");
  442.     ll ans = 1;
  443.     a %= mod;
  444.     while (b) {
  445.         if (b & 1) ans = (ans * a) % mod;
  446.         a = (a * a) % mod;
  447.         b >>= 1;
  448.     }
  449.     return ans;
  450. }
  451. // Power Function End
  452.  
  453. // Modular Inverse Start
  454. inline ll mod_inv(ll a, const ll mod = mod1) {
  455.     assert(a >= 0 && "The number must be non-negative.");
  456.     return power(a, mod - 2, mod);
  457. }
  458. // Modular Inverse End
  459.  
  460. // Fast Fib Start
  461. ll fast_fib(ll n, const ll mod = mod1, const bl is_mod = true) {
  462.     assert(n >= 0 && "The numbers can't be negative.");
  463.     ll a0 = 0, a1 = 1, f2, f21, t;
  464.     for (ll i = 61; i >= 0; --i) {
  465.         f2 = a0 * (2 * a1 - a0);
  466.         f21 = a0 * a0 + a1 * a1;
  467.         if (is_mod) {
  468.             f2 %= mod;
  469.             f21 %= mod;
  470.         }
  471.         if (n & (one << i)) {
  472.             a0 = f21;
  473.             a1 = f2 + f21;
  474.             if (is_mod) a1 %= mod;
  475.         }
  476.         else {
  477.             a0 = f2;
  478.             a1 = f21;
  479.         }
  480.     }
  481.     return is_mod ? a0 % mod : a0;
  482. }
  483. // Fast Fib End
  484.  
  485. // KMP Algorithm Start
  486. ll substr_is_in(const str& text, const str& pattern) {
  487.     const size_t m = pattern.size();
  488.     const size_t n = text.size();
  489.     vecll lps(m, 0);
  490.     ll len = 0, i = 1, j;
  491.     while (i < m) {
  492.         if (pattern[i] == pattern[len]) lps[i++] = ++len;
  493.         else {
  494.             if (len != 0) len = lps[len - 1];
  495.             else lps[i++] = 0;
  496.         }
  497.     }
  498.     i = 0, j = 0;
  499.     while (i < n) {
  500.         if (pattern[j] == text[i]) {
  501.             ++i;
  502.             ++j;
  503.         }
  504.         if (j == m) return i - j;
  505.         else if (i < n && pattern[j] != text[i]) {
  506.             if (j != 0) j = lps[j - 1];
  507.             else ++i;
  508.         }
  509.     }
  510.     return -1;
  511. }
  512. // KMP Algorithm End
  513. // Algorithms End
  514.  
  515. //------------------------------------------------------------------------------------------
  516.  
  517. // Classes Start
  518. // Big Int Start
  519. namespace fft {
  520.     const ll mod = -1;
  521.     class cpx {
  522.     public:
  523.         double r, i;
  524.         cpx(double _r = 0, double _i = 0) : r(_r), i(_i) {}
  525.         cpx operator+(cpx b) { return { r + b.r, i + b.i }; }
  526.         cpx operator-(cpx b) { return { r - b.r, i - b.i }; }
  527.         cpx operator*(cpx b) { return { r * b.r - i * b.i, r * b.i + i * b.r }; }
  528.         cpx operator/(double b) { return { r / b, i / b }; }
  529.         inline cpx conj() { return { r, -i }; }
  530.     };
  531.     const double PI = acos(-1);
  532.     vector<ll> rev(1, 0);
  533.     vector<cpx> roots;
  534.     ll base = 0;
  535.     void precompute(ll nbase) {
  536.         if (nbase <= base)
  537.             return;
  538.         rev.resize(1 << nbase);
  539.         for (ll i = 0; i < (1 << nbase); ++i) {
  540.             rev[i] = rev[i >> 1] >> 1 | ((i & 1) << (nbase - 1));
  541.         }
  542.         roots.resize(1 << nbase);
  543.         for (; base < nbase; ++base) {
  544.             ll len = 1 << base;
  545.             double angle = 2 * PI / (1 << (base + 1));
  546.             for (ll i = 0; i < len; ++i) {
  547.                 double cur = angle * i;
  548.                 roots[len + i] = cpx(cos(cur), sin(cur));
  549.             }
  550.         }
  551.     }
  552.     void fft(vector<cpx>& a, ll n = -1) {
  553.         if (n == -1)
  554.             n = a.size();
  555.         assert((n & (n - 1)) == 0);
  556.         ll zeros = __builtin_ctz(n);
  557.         precompute(zeros);
  558.         ll shift = base - zeros;
  559.         for (ll i = 0; i < n; ++i) {
  560.             if (i < (rev[i] >> shift))
  561.                 swap(a[i], a[rev[i] >> shift]);
  562.         }
  563.         for (ll len = 1; len < n; len <<= 1)
  564.             for (ll i = 0; i < n; i += 2 * len)
  565.                 for (ll j = 0; j < len; ++j) {
  566.                     cpx u = a[i + j], v = a[i + j + len] * roots[len + j];
  567.                     a[i + j] = u + v;
  568.                     a[i + j + len] = u - v;
  569.                 }
  570.     }
  571.     vector<cpx> fa, fb;
  572.     vector<ll> multiply(const vector<ll>& a, const vector<ll>& b) {
  573.         if (a.empty() || b.empty()) return {};
  574.         ll sz = a.size() + b.size() - 1;
  575.         ll n = sz == 1 ? 1 : 1 << (32 - __builtin_clz(sz - 1));
  576.         if (n > fa.size()) fa.resize(n);
  577.         for (ll i = 0; i < n; ++i) {
  578.             ll x = i < a.size() ? a[i] : 0;
  579.             ll y = i < b.size() ? b[i] : 0;
  580.             fa[i] = cpx(x, y);
  581.         }
  582.         fft(fa, n);
  583.         cpx r(0, -0.5 / n);
  584.         for (ll i = 0; i <= (n >> 1); ++i) {
  585.             ll j = (n - i) & (n - 1);
  586.             cpx x = (fa[i] + fa[j].conj()) / 2;
  587.             cpx y = (fa[i] - fa[j].conj()) * r;
  588.             fa[i] = x * y;
  589.             if (i != j) fa[j] = fa[i].conj();
  590.         }
  591.         fft(fa, n);
  592.         reverse(fa.begin() + 1, fa.begin() + n);
  593.         vector<ll> res(sz);
  594.         for (ll i = 0; i < sz; ++i) res[i] = llround(fa[i].r);
  595.         return res;
  596.     }
  597. }
  598.  
  599. const ll BASE = 1000;
  600. const ll BASE_DIGITS = log10(BASE);
  601.  
  602. class BigInt {
  603. private:
  604.     bool neg = false;
  605.     vecll num;
  606. public:
  607.     BigInt() {}
  608.     BigInt(const string& s) {
  609.         ll st = 0;
  610.         if (s[0] == '-') {
  611.             neg = true;
  612.             st = 1;
  613.         }
  614.         for (ll i = (ll)s.size() - 1; i >= st; i -= BASE_DIGITS) {
  615.             ll x = 0;
  616.             for (ll j = max(st, i - BASE_DIGITS + 1); j <= i; ++j) x = x * 10 + s[j] - '0';
  617.             num.push_back(x);
  618.         }
  619.         trim();
  620.     }
  621.     BigInt(ll m) {
  622.         if (m < 0) neg = true;
  623.         while (m) {
  624.             num.push_back(abs(m % BASE));
  625.             m /= BASE;
  626.         }
  627.     }
  628.  
  629.     void trim() {
  630.         while (!num.empty() && !num.back()) num.pop_back();
  631.         if (num.empty()) neg = false;
  632.     }
  633.  
  634.     bool operator<(const BigInt& v) const {
  635.         if (neg != v.neg) return neg > v.neg;
  636.         if (num.size() != v.num.size()) return neg ? num.size() > v.num.size() : num.size() < v.num.size();
  637.         for (ll i = (ll)num.size() - 1; i >= 0; --i)
  638.             if (num[i] != v.num[i]) return neg ? num[i] > v.num[i] : num[i] < v.num[i];
  639.         return false;
  640.     }
  641.     bool operator>(const BigInt& v) const { return v < *this; }
  642.     bool operator<=(const BigInt& v) const { return !(v < *this); }
  643.     bool operator>=(const BigInt& v) const { return !(*this < v); }
  644.     bool operator==(const BigInt& v) const { return num == v.num && neg == v.neg; }
  645.     bool operator!=(const BigInt& v) const { return !(*this == v); }
  646.  
  647.     BigInt operator-() const {
  648.         BigInt ret(*this);
  649.         if (!ret.num.empty()) ret.neg = !ret.neg;
  650.         return ret;
  651.     }
  652.     BigInt& operator+=(const BigInt& x) {
  653.         if (neg && !x.neg) return *this = x - (-*this);
  654.         if (!neg && x.neg) return *this -= -x;
  655.         assert(neg == x.neg);
  656.         ll maxs = max(num.size(), x.num.size());
  657.         num.resize(maxs);
  658.         ll carry = 0;
  659.         for (ll i = 0; i < maxs; ++i) {
  660.             ll other = i >= x.num.size() ? 0 : x.num[i];
  661.             num[i] += other + carry;
  662.             carry = num[i] / BASE;
  663.             num[i] %= BASE;
  664.         }
  665.         if (carry) num.push_back(carry);
  666.         return *this;
  667.     }
  668.     BigInt& subtract(const BigInt& x) {
  669.         assert(!neg && !x.neg);
  670.         ll carry = 0;
  671.         for (ll i = 0; i < num.size(); ++i) {
  672.             ll other = i >= x.num.size() ? 0 : x.num[i];
  673.             num[i] -= other + carry;
  674.             carry = num[i] < 0;
  675.             if (carry) num[i] += BASE;
  676.         }
  677.         trim();
  678.         return *this;
  679.     }
  680.     BigInt& operator-=(const BigInt& x) {
  681.         if (neg && !x.neg) return *this = -(-*this + x);
  682.         if (x.neg) return *this += -x;
  683.         assert(!neg && !x.neg);
  684.         if (*this < x) {
  685.             BigInt y = *this;
  686.             *this = x;
  687.             return *this = -subtract(y);
  688.         }
  689.         return subtract(x);
  690.     }
  691.     BigInt& operator*=(ll m) {
  692.         const ll MX = LLONG_MAX / BASE;
  693.         if (m < -MX || m > MX) return *this *= BigInt(m);
  694.         neg ^= m < 0;
  695.         m = abs(m);
  696.         ll carry = 0;
  697.         for (ll i = 0; i < num.size(); ++i) {
  698.             ll v = num[i] * m + carry;
  699.             carry = v / BASE;
  700.             num[i] = v % BASE;
  701.         }
  702.         while (carry) {
  703.             num.push_back(carry % BASE);
  704.             carry /= BASE;
  705.         }
  706.         trim();
  707.         return *this;
  708.     }
  709.     BigInt& operator*=(const BigInt& x) {
  710.         if (num.empty()) return *this;
  711.         neg ^= x.neg;
  712.         auto c = fft::multiply(num, x.num);
  713.         num.resize(c.size());
  714.         ll carry = 0;
  715.         for (ll i = 0; i < c.size(); ++i) {
  716.             c[i] += carry;
  717.             carry = c[i] / BASE;
  718.             num[i] = c[i] % BASE;
  719.         }
  720.         if (carry) num.push_back(carry);
  721.         trim();
  722.         return *this;
  723.     }
  724.  
  725.     ll divide_and_remainder(ll d) {
  726.         assert(d != 0);
  727.         const ll MX = LLONG_MAX / BASE;
  728.         if (d < -MX || d > MX) return static_cast<ll>(divide_and_remainder(BigInt(d)));
  729.         bool wasNeg = neg;
  730.         neg ^= d < 0;
  731.         d = abs(d);
  732.         ll cur = 0;
  733.         vector<ll> ret(num.size());
  734.         for (ll i = (ll)num.size() - 1; i >= 0; --i) {
  735.             cur *= BASE;
  736.             cur += num[i];
  737.             ret[i] = cur / d;
  738.             cur %= d;
  739.         }
  740.         swap(num, ret);
  741.         trim();
  742.         return wasNeg ? -cur : cur;
  743.     }
  744.  
  745.     BigInt& operator/=(ll v) {
  746.         divide_and_remainder(v);
  747.         return *this;
  748.     }
  749.     BigInt& operator%=(ll v) {
  750.         ll remainder = divide_and_remainder(v);
  751.         return *this = BigInt(remainder);
  752.     }
  753.     BigInt divide_and_remainder(BigInt b) {
  754.         assert(!b.num.empty());
  755.         bool wasNeg = neg;
  756.         neg ^= b.neg;
  757.         b.neg = false;
  758.         BigInt cur;
  759.         vector<ll> ret(num.size());
  760.         for (ll i = (ll)num.size() - 1; i >= 0; --i) {
  761.             cur *= BASE;
  762.             cur += num[i];
  763.             ll lo = 0, hi = BASE - 1;
  764.             while (lo < hi) {
  765.                 ll d = (lo + hi + 1) >> 1;
  766.                 if (b * d > cur) hi = d - 1;
  767.                 else lo = d;
  768.             }
  769.             cur -= b * lo;
  770.             ret[i] = lo;
  771.         }
  772.         swap(num, ret);
  773.         trim();
  774.         if (wasNeg && !cur.num.empty()) cur.neg = true;
  775.         return cur;
  776.     }
  777.     BigInt& operator/=(const BigInt& x) {
  778.         divide_and_remainder(x);
  779.         return *this;
  780.     }
  781.     BigInt& operator%=(const BigInt& x) { return *this = divide_and_remainder(x); }
  782.     BigInt& operator++() { return *this += 1; }
  783.     BigInt& operator--() { return *this -= 1; }
  784.     BigInt operator++(int) {
  785.         BigInt ret(*this);
  786.         *this += 1;
  787.         return ret;
  788.     }
  789.     BigInt operator--(int) {
  790.         BigInt ret(*this);
  791.         *this -= 1;
  792.         return ret;
  793.     }
  794.  
  795.     friend BigInt operator+(BigInt a, const BigInt& b) { return a += b; }
  796.     friend BigInt operator-(BigInt a, const BigInt& b) { return a -= b; }
  797.     friend BigInt operator*(ll a, BigInt b) { return b *= a; }
  798.     friend BigInt operator*(BigInt a, ll b) { return a *= b; }
  799.     friend BigInt operator*(BigInt a, const BigInt& b) { return a *= b; }
  800.     friend BigInt operator/(BigInt a, ll b) { return a /= b; }
  801.     friend BigInt operator/(BigInt a, const BigInt& b) { return a /= b; }
  802.     friend BigInt operator%(BigInt a, ll b) { return a %= b; }
  803.     friend BigInt operator%(BigInt a, const BigInt& b) { return a %= b; }
  804.  
  805.     explicit operator ll() const {
  806.         const unsigned long long MAX_ABS = LLONG_MAX + (unsigned ll)neg;
  807.         const unsigned long long MX = MAX_ABS / BASE;
  808.         unsigned long long ret = 0;
  809.         for (ll i = (ll)num.size() - 1; i >= 0; --i) {
  810.             if (ret > MX) throw;
  811.             ret *= BASE;
  812.             if (ret > MAX_ABS - num[i]) throw;
  813.             ret += num[i];
  814.         }
  815.         assert(ret <= MAX_ABS);
  816.         return neg ? -ret : ret;
  817.     }
  818.     str operator()() const {
  819.         if (num.empty()) return "0";
  820.         str ret;
  821.         if (neg) ret += '-';
  822.         ret += to_string(num.back());
  823.         str fmt = "%0" + to_string(BASE_DIGITS) + "d";
  824.         for (ll i = (ll)num.size() - 2; i >= 0; --i) {
  825.             char buf[BASE_DIGITS + 1];
  826.             sprintf(buf, fmt.c_str(), num[i]);
  827.             ret += buf;
  828.         }
  829.         return ret;
  830.     }
  831.  
  832.     friend BigInt gcd(const BigInt& a, ll b) {
  833.         if (!b) return abs(a);
  834.         ll r = static_cast<ll>(abs(a % b));
  835.         if (r == 0) return abs(BigInt(b));
  836.         return __gcd(r, abs(b % r));
  837.     }
  838.     friend BigInt gcd(ll a, const BigInt& b) { return gcd(b, a); }
  839.     friend BigInt gcd(BigInt a, BigInt b) {
  840.         a.neg = b.neg = false;
  841.         while (!b.num.empty()) {
  842.             BigInt c(b);
  843.             b = a % b;
  844.             swap(a, c);
  845.         }
  846.         return a;
  847.     }
  848.     friend BigInt rand_big_ll(BigInt n) {
  849.         static mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
  850.         assert(!n.num.empty() && !n.neg);
  851.         n--;
  852.         for (;;) {
  853.             BigInt res;
  854.             res.num.resize(n.num.size());
  855.             for (ll i = (ll)n.num.size() - 1; i >= 0; --i) {
  856.                 ll mx = (i + 1 == n.num.size()) ? n.num[i] : BASE - 1;
  857.                 res.num[i] = rng() % (mx + 1);
  858.             }
  859.             res.trim();
  860.             if (res <= n) return res;
  861.         }
  862.         assert(false);
  863.     }
  864.     friend BigInt abs(BigInt x) {
  865.         x.neg = false;
  866.         return x;
  867.     }
  868.     template <class U>
  869.     friend U& operator<<(U& os, const BigInt& x) {
  870.         os << x();
  871.         return os;
  872.     }
  873.     template <class U>
  874.     friend U& operator>>(U& is, BigInt& x) {
  875.         str s;
  876.         is >> s;
  877.         x = s;
  878.         return is;
  879.     }
  880. };
  881. BigInt operator""_b(const char* str) {
  882.     BigInt temp(str);
  883.     return temp;
  884. }
  885.  
  886. typedef BigInt bll;
  887. // Big Int end
  888.  
  889. // Modular Start
  890. class Modular {
  891. private:
  892.     ll value;
  893.     const ll mod;
  894.     inline void normalize(ll& val) {
  895.         if (val >= mod && val <= -mod) val %= mod;
  896.         if (val < 0) val += mod;
  897.     }
  898.  
  899. public:
  900.     Modular(ll x = 0, ll m = mod1) : mod(m) {
  901.         normalize(x);
  902.         value = x;
  903.     }
  904.     Modular(const Modular& other) : value(other.value), mod(other.mod) {}
  905.     Modular& operator=(const Modular& other) {
  906.         assert(mod == other.mod && "The mod values have to be the same.");
  907.         if (this != &other) value = other.value;
  908.         return *this;
  909.     }
  910.     Modular& operator=(ll val) {
  911.         normalize(val);
  912.         value = val;
  913.         return *this;
  914.     }
  915.  
  916.     ll operator()() const {
  917.         return value;
  918.     }
  919.     operator ll() const {
  920.         return value;
  921.     }
  922.  
  923.     Modular& operator+=(ll val) {
  924.         normalize(val);
  925.         value = (value + val) % mod;
  926.         return *this;
  927.     }
  928.     Modular& operator-=(ll val) {
  929.         normalize(val);
  930.         value = (value - val + mod) % mod;
  931.         return *this;
  932.     }
  933.     Modular& operator*=(ll val) {
  934.         normalize(val);
  935.         value = (value * val) % mod;
  936.         return *this;
  937.     }
  938.     Modular pow(ll p) {
  939.         return Modular(power(this->value, p, this->mod), this->mod);
  940.     }
  941.     Modular mod_in() {
  942.         return Modular(mod_inv(this->value, this->mod), this->mod);
  943.     }
  944.     Modular& operator/=(ll val) {
  945.         value = (value * mod_inv(val, mod)) % mod;
  946.         return *this;
  947.     }
  948.     Modular& operator<<=(ll val) {
  949.         value = (value * power(2, val, mod)) % mod;
  950.         return *this;
  951.     }
  952.     Modular& operator>>=(ll val) {
  953.         value = (value * mod_inv(power(2, val, mod), mod)) % mod;
  954.         return *this;
  955.     }
  956.     Modular& operator++() {
  957.         if (++value >= mod) value -= mod;
  958.         return *this;
  959.     }
  960.     Modular& operator--() {
  961.         if (--value < 0) value += mod;
  962.         return *this;
  963.     }
  964.     Modular operator++(int) {
  965.         Modular ret(*this);
  966.         if (++value >= mod) value -= mod;
  967.         return ret;
  968.     }
  969.     Modular operator--(int) {
  970.         Modular ret(*this);
  971.         if (--value < 0) value += mod;
  972.         return ret;
  973.     }
  974.     Modular operator-() const {
  975.         return Modular(mod - value, mod);
  976.     }
  977.     Modular operator+(ll val) {
  978.         return Modular(*this) += val;
  979.     }
  980.     Modular operator-(ll val) {
  981.         return Modular(*this) -= val;
  982.     }
  983.     Modular operator*(ll val) {
  984.         return Modular(*this) *= val;
  985.     }
  986.     Modular operator/(ll val) {
  987.         return Modular(*this) /= val;
  988.     }
  989.     Modular operator<<(ll val) {
  990.         return Modular(*this) <<= val;
  991.     }
  992.     Modular operator>>(ll val) {
  993.         return Modular(*this) >>= val;
  994.     }
  995.  
  996.     template <class U>
  997.     friend U& operator<<(U& os, const Modular& num) {
  998.         return os << num.value;
  999.     }
  1000.     template <class U>
  1001.     friend U& operator>>(U& is, Modular& num) {
  1002.         ll x;
  1003.         is >> x;
  1004.         num.value = (x % num.mod + num.mod) % num.mod;
  1005.         return is;
  1006.     }
  1007.     friend bool operator<(const Modular& lhs, const Modular& rhs) {
  1008.         return lhs.value < rhs.value;
  1009.     }
  1010.     friend bool operator>(const Modular& lhs, const Modular& rhs) {
  1011.         return lhs.value > rhs.value;
  1012.     }
  1013.     friend bool operator<=(const Modular& lhs, const Modular& rhs) {
  1014.         return lhs.value <= rhs.value;
  1015.     }
  1016.     friend bool operator>=(const Modular& lhs, const Modular& rhs) {
  1017.         return lhs.value >= rhs.value;
  1018.     }
  1019.     friend bool operator==(const Modular& lhs, const Modular& rhs) {
  1020.         return lhs.value == rhs.value;
  1021.     }
  1022.     friend bool operator!=(const Modular& lhs, const Modular& rhs) {
  1023.         return lhs.value != rhs.value;
  1024.     }
  1025. };
  1026. Modular operator""_m(const char* str) {
  1027.     Modular temp(stoll(str), mod1);
  1028.     return temp;
  1029. }
  1030. Modular operator""_m2(const char* str) {
  1031.     Modular temp(stoll(str), mod2);
  1032.     return temp;
  1033. }
  1034.  
  1035. typedef Modular mll;
  1036. typedef vector<mll> vecmll;
  1037. // Modular End
  1038.  
  1039.  
  1040. // PNC Start
  1041. class PNC {
  1042. public:
  1043.     const ll size, mod;
  1044.     vecll fact, invfact;
  1045.     PNC(const ll len = max_if, const ll m = mod1) : size(len), mod(m), fact(size + 1, 1), invfact(size + 1, 0) {
  1046.         invfact[0] = mod_inv(fact[0], mod);
  1047.         for (ll i = 1; i <= size; ++i) {
  1048.             fact[i] = (fact[i - 1] * i) % mod;
  1049.             invfact[i] = mod_inv(fact[i], mod);
  1050.         }
  1051.     }
  1052.  
  1053.     ll facto(ll n) {
  1054.         assert(n >= 0 && "The number can't be negative.");
  1055.         if (n <= size) return fact[n];
  1056.         ll ans = 1;
  1057.         for (ll i = 1; i <= n; ++i) ans = (ans * i) % mod;
  1058.         return ans;
  1059.     }
  1060.  
  1061.     ll perm(ll n, ll r) {
  1062.         assert(n >= 0 && r >= 0 && "The number can't be negative.");
  1063.         if (n < r) return 0;
  1064.         if (n <= size) return (fact[n] * invfact[n - r]) % mod;
  1065.         ll ans = 1;
  1066.         for (ll i = n - r + 1; i <= n; ++i) ans = (ans * i) % mod;
  1067.         return ans;
  1068.     }
  1069.  
  1070.     ll comb(ll n, ll r) {
  1071.         assert(n >= 0 && r >= 0 && "The number can't be negative.");
  1072.         if (n < r) return 0;
  1073.         if (n <= size) return (fact[n] * (invfact[n - r] * invfact[r] % mod)) % mod;
  1074.         ll num = 1, den = 1;
  1075.         if (r > n / 2) r = n - r;
  1076.         ++n;
  1077.         for (ll i = 1; i <= r; ++i) {
  1078.             num = (num * (n - i)) % mod;
  1079.             den = (den * i) % mod;
  1080.         }
  1081.         return (num * mod_inv(den, mod)) % mod;
  1082.     }
  1083. };
  1084. // PNC End
  1085.  
  1086. // Prime Start
  1087. class Prime {
  1088. public:
  1089.     ll size;
  1090.     vecbl isprime;
  1091.     vecll primes;
  1092.     Prime(const ll len = max_if) : size(len), isprime(size + 1, true) {
  1093.         isprime[0] = isprime[1] = false;
  1094.         for (ll i = 2; i <= sqrt_int_u(size); ++i)
  1095.             if (isprime[i])
  1096.                 for (ll j = i * i; j <= size; j += i) isprime[j] = false;
  1097.         for (ll i = 2; i <= size; ++i)
  1098.             if (isprime[i]) primes.pb(i);
  1099.     }
  1100.  
  1101.     bool is_prime(ll n, bool old = false) {
  1102.         assert(n > 0 && "The given number can't be negative");
  1103.         if (n == 1) return false;
  1104.         if (n <= 3) return true;
  1105.         if (n % 2 == 0 || n % 3 == 0) return false;
  1106.         if (n <= size) return isprime[n];
  1107.         if (old) {
  1108.             for (ll i = 5; i < (int)sqrt(n) + 1; i += 6)
  1109.                 if (n % i == 0 || n % (i + 2) == 0) return false;
  1110.             return true;
  1111.         }
  1112.         ll d = n - 1;
  1113.         while (d % 2 == 0) d /= 2;
  1114.         auto miller = [&](ll a) {
  1115.             if (a % n == 0) return true;
  1116.             ll x = power(a, d, n);
  1117.             if (x == 1 || x == n - 1) return true;
  1118.             ll c = d;
  1119.             while (c < n - 1) {
  1120.                 x = (x * x) % n;
  1121.                 if (x == n - 1) return true;
  1122.                 c <<= 1;
  1123.             }
  1124.             return false;
  1125.             };
  1126.         vector<ll> bases64 = { 2, 325, 9375, 28178, 450775, 9780504, 1795265022 };
  1127.         vector<ll> bases32 = { 2, 7, 61 };
  1128.         vector<ll>& bases = n <= 4294967296ll ? bases32 : bases64;
  1129.         for (ll base : bases)
  1130.             if (!miller(base)) return false;
  1131.         return true;
  1132.     }
  1133. };
  1134. // Prime End
  1135.  
  1136. // Polynomial Hashing Start
  1137. class PolyHash {
  1138. public:
  1139.     ll n;
  1140.     str s;
  1141.     vecll hash, powers, mmi;
  1142.     const ll p = 31;
  1143.     PolyHash(str& st): n(st.size()), s(st), hash(n, 0), powers(n, 1), mmi(n, 1) {
  1144.         for (ll i = 1; i < n; i++) {
  1145.             powers[i] = (powers[i - 1] * p) % mod1;
  1146.             mmi[i] = mod_inv(powers[i]);
  1147.         }
  1148.         hash[0] = s[0] - 'a' + 1;
  1149.         for (ll i = 1; i < n; i++) hash[i] = (hash[i - 1] + (powers[i] * (s[i] - 'a' + 1) % mod1)) % mod1;
  1150.     }
  1151.  
  1152.     ll hash_val(ll left, ll right) {
  1153.         if (left == 0) return hash[right];
  1154.         ll ans = (hash[right] - hash[left - 1] + mod1) % mod1;
  1155.         ans = (mmi[left] * ans) % mod1;
  1156.         return ans;
  1157.     }
  1158. };
  1159. // Polynomial Hashing End
  1160.  
  1161. // Disjoint Set Union Start
  1162. class DisjointSet {
  1163. private:
  1164.     vecll parent, depth, set_size, max_set, min_set;
  1165.     ll num_sets, max_size;
  1166. public:
  1167.     DisjointSet() {}
  1168.     DisjointSet(ll n, ll start = 1) { init(n, start); }
  1169.     DisjointSet(const DisjointSet& obj) : parent(all(obj.parent)), depth(all(obj.depth)), set_size(all(obj.set_size)), min_set(all(obj.min_set)), max_set(all(obj.max_set)), max_size(obj.max_size), num_sets(obj.num_sets) {}
  1170.  
  1171.     void init(ll n, ll start = 1) {
  1172.         num_sets = n;
  1173.         max_size = 1;
  1174.         n += start;
  1175.         parent.assign(n, 0);
  1176.         max_set.assign(n, 0);
  1177.         min_set.assign(n, 0);
  1178.         for (ll i = start; i < n; ++i) parent[i] = max_set[i] = min_set[i] = i;
  1179.         depth.assign(n, 0);
  1180.         set_size.assign(n, 1);
  1181.     }
  1182.     ll find_set(ll n) {
  1183.         return parent[n] = (parent[n] == n ? n : find_set(parent[n]));
  1184.     }
  1185.     ll find_set(ll n, bool p) {
  1186.         stack<ll> st;
  1187.         ll v;
  1188.         while (n != parent[n]) {
  1189.             st.push(n);
  1190.             n = parent[n];
  1191.         }
  1192.         while (!st.empty()) {
  1193.             v = st.top();
  1194.             st.pop();
  1195.             parent[v] = n;
  1196.         }
  1197.         return n;
  1198.     }
  1199.     bool is_same_set(ll a, ll b) {
  1200.         return find_set(a) == find_set(b);
  1201.     }
  1202.     void union_set(ll a, ll b) {
  1203.         ll x = find_set(a), y = find_set(b);
  1204.         if (x == y) return;
  1205.         if (depth[x] > depth[y]) swap(x, y);
  1206.         if (depth[x] == depth[y]) depth[y]++;
  1207.         parent[x] = y;
  1208.         set_size[y] += set_size[x];
  1209.         max_size = max((ll)max_size, set_size[y]);
  1210.         min_set[y] = min(min_set[y], min_set[x]);
  1211.         max_set[y] = max(max_set[y], max_set[x]);
  1212.         num_sets--;
  1213.     }
  1214.     ll num_of_sets() { return num_sets; }
  1215.     ll size_of_set(ll n) { return set_size[find_set(n)]; }
  1216.     ll max_of_set(ll n) { return max_set[find_set(n)]; }
  1217.     ll min_of_set(ll n) { return min_set[find_set(n)]; }
  1218.     ll max_size_of_sets() { return max_size; }
  1219. };
  1220. // Disjoint Set Union End
  1221.  
  1222. // Unweighted Graph Start
  1223. class UnweightedGraph {
  1224. private:
  1225.     ll count;
  1226.  
  1227.     void dfsPr(ll src) {
  1228.         visited[src] = true;
  1229.         pre[src] = count;
  1230.         count++;
  1231.         for (auto it : a_list[src]) {
  1232.             if (!visited[it]) {
  1233.                 parent[it] = src;
  1234.                 dfsPr(it);
  1235.             }
  1236.         }
  1237.         post[src] = count;
  1238.         count++;
  1239.     }
  1240. public:
  1241.     vector<vecll> a_list;
  1242.     vecbl visited;
  1243.     vecll level, component, topo_order, path_len, parent, pre, post;
  1244.     ll start, end, num_of_comp;
  1245.  
  1246.     UnweightedGraph(const vector<vecll>& a_lis, ll star = 1) {
  1247.         a_list = a_lis;
  1248.         start = star;
  1249.         end = a_lis.size() + start;
  1250.     }
  1251.     void dfs(ll src, bool iter = true) {
  1252.         visited.assign(end, false);
  1253.         parent.assign(end, -1);
  1254.         pre.assign(end, -1);
  1255.         post.assign(end, -1);
  1256.         if (iter) {
  1257.             ll cou = 0;
  1258.             stack<ll> st;
  1259.             ll u;
  1260.             bool flag;
  1261.             st.push(src);
  1262.             while (!st.empty()) {
  1263.                 u = st.top();
  1264.                 if (!visited[u]) {
  1265.                     visited[u] = true;
  1266.                     pre[u] = cou;
  1267.                     ++cou;
  1268.                 }
  1269.                 flag = true;
  1270.                 for (ll v : a_list[u]) {
  1271.                     if (!visited[v]) {
  1272.                         parent[v] = u;
  1273.                         st.push(v);
  1274.                         flag = false;
  1275.                         break;
  1276.                     }
  1277.                 }
  1278.                 if (flag) {
  1279.                     post[u] = cou;
  1280.                     ++cou;
  1281.                     st.pop();
  1282.                 }
  1283.             }
  1284.         }
  1285.         else {
  1286.             count = 0;
  1287.             dfsPr(src);
  1288.         }
  1289.     }
  1290.     void bfs(ll src) {
  1291.         level.assign(end, -1);
  1292.         parent.assign(end, -1);
  1293.         queue<ll> que;
  1294.         que.push(src);
  1295.         level[src] = 0;
  1296.         ll v;
  1297.         while (!que.empty()) {
  1298.             v = que.front();
  1299.             que.pop();
  1300.             for (auto it : a_list[v]) {
  1301.                 if (level[it] == -1) {
  1302.                     level[it] = level[v] + 1;
  1303.                     parent[it] = v;
  1304.                     que.push(it);
  1305.                 }
  1306.             }
  1307.         }
  1308.     }
  1309.     void components() {
  1310.         component.assign(end, -1);
  1311.         ll seen = start, src, i;
  1312.         num_of_comp = 0;
  1313.         while (seen < end) {
  1314.             src = -1;
  1315.             for (i = start; i < end; ++i) {
  1316.                 if (component[i] == -1) {
  1317.                     src = i;
  1318.                     break;
  1319.                 }
  1320.             }
  1321.             bfs(src);
  1322.             for (auto it : level) {
  1323.                 if (level[it] != -1) {
  1324.                     component[it] = num_of_comp;
  1325.                     ++seen;
  1326.                 }
  1327.             }
  1328.             ++num_of_comp;
  1329.         }
  1330.     }
  1331.     void topological_order() {
  1332.         vecll in_degree(end, 0);
  1333.         path_len.assign(end, 0);
  1334.         ll i;
  1335.         for (i = start; i < end; ++i)
  1336.             for (auto it : a_list[i]) ++in_degree[it];
  1337.         queue<ll> que;
  1338.         for (i = start; i < end; ++i)
  1339.             if (in_degree[i] == 0) que.push(i);
  1340.         ll v;
  1341.         while (!que.empty()) {
  1342.             v = que.front();
  1343.             que.pop();
  1344.             topo_order.pb(v);
  1345.             in_degree[v] = -1;
  1346.             for (auto it : a_list[v]) {
  1347.                 in_degree[it]--;
  1348.                 path_len[it] = max(path_len[it], path_len[v] + 1);
  1349.                 if (in_degree[it] == 0) que.push(it);
  1350.             }
  1351.         }
  1352.     }
  1353. };
  1354. // Unweighted Graph End
  1355.  
  1356. // Weighted Graph Start
  1357. class WeightedGraph {
  1358. public:
  1359.     vector<vecprll> w_list;
  1360.     vector<vecll> distance_fw;
  1361.     DisjointSet component;
  1362.     vecprll edge;
  1363.     vecll distance;
  1364.     ll start, end;
  1365.  
  1366.     WeightedGraph(const vector<vecprll>& w_lis, ll star = 1) {
  1367.         w_list = w_lis;
  1368.         start = star;
  1369.         end = w_lis.size() + star;
  1370.     }
  1371.  
  1372.     void dijkstra(ll src) {
  1373.         vecbl visited(end, false);
  1374.         distance.assign(end, inf);
  1375.         distance[src] = 0;
  1376.         minheapprll heap;
  1377.         heap.push({ 0, src });
  1378.         ll nextv;
  1379.         while (!heap.empty()) {
  1380.             nextv = heap.top().S;
  1381.             heap.pop();
  1382.             if (visited[nextv]) continue;
  1383.             visited[nextv] = true;
  1384.             for (auto it : w_list[nextv]) {
  1385.                 if (!visited[it.F] && distance[nextv] + it.S < distance[it.F]) {
  1386.                     distance[it.F] = distance[nextv] + it.S;
  1387.                     heap.push({ distance[it.F], it.F });
  1388.                 }
  1389.             }
  1390.         }
  1391.     }
  1392.     void bellman_ford(ll src) {
  1393.         distance.assign(end, inf);
  1394.         distance[src] = 0;
  1395.         ll i, u;
  1396.         for (i = start; i < end - 1; ++i)
  1397.             for (u = start; u < end; ++u)
  1398.                 for (auto it : w_list[u]) distance[it.F] = min(distance[it.F], distance[u] + it.S);
  1399.         bool flag = false;
  1400.         for (u = start; u < end; ++u)
  1401.             for (auto it : w_list[u])
  1402.                 assert(distance[u] + it.S >= distance[it.F] && "The graph has negative cycles.");
  1403.     }
  1404.     void floyd_warshall() {
  1405.         distance_fw.assign(end, vecll(end, inf));
  1406.         ll i, j, k;
  1407.         for (i = start; i < end; ++i)
  1408.             for (auto it : w_list[i]) distance_fw[i][it.F] = it.S;
  1409.         for (i = start; i < end; ++i)
  1410.             for (j = start; j < end; ++j)
  1411.                 for (k = start; k < end; ++k) distance_fw[j][k] = min(distance_fw[j][k], distance_fw[j][i] + distance_fw[i][k]);
  1412.     }
  1413.     void prim() {
  1414.         vecbl visited(end, false);
  1415.         distance.assign(end, inf);
  1416.         distance[start] = 0;
  1417.         minheapprll heap;
  1418.         heap.push({ 0, start });
  1419.         ll nextv;
  1420.         while (!heap.empty()) {
  1421.             nextv = heap.top().S;
  1422.             if (visited[nextv]) continue;
  1423.             visited[nextv] = true;
  1424.             for (auto it : w_list[nextv]) {
  1425.                 if (!visited[it.F] && it.S < distance[it.F]) {
  1426.                     distance[it.F] = it.S;
  1427.                     heap.push({ it.S, it.F });
  1428.                 }
  1429.             }
  1430.         }
  1431.     }
  1432.     void kruskal() {
  1433.         component.init(end - start, start);
  1434.         set<tupll> edges;
  1435.         ll u, v;
  1436.         for (u = start; u < end; ++u)
  1437.             for (auto it : w_list[u]) edges.insert({ it.S, u, it.F });
  1438.         for (auto it : edges) {
  1439.             u = get<1>(it);
  1440.             v = get<2>(it);
  1441.             if (component.is_same_set(u, v)) continue;
  1442.             edge.pb({ u, v });
  1443.             component.union_set(u, v);
  1444.         }
  1445.     }
  1446. };
  1447. // Weighted Graph End
  1448.  
  1449. // Segment Tree Start
  1450. template <class T>
  1451. class SegmentTree {
  1452. private:
  1453.     const function<T(T, T)>& func;
  1454.     vector<T> tree;
  1455.     const size_t size;
  1456.     size_t query_left, query_right, update_index, update_new_value;
  1457.  
  1458.     void build_tree(size_t tree_index, size_t left, size_t right) {
  1459.         if (left == right) {
  1460.             tree[tree_index] = data[left];
  1461.             return;
  1462.         }
  1463.         size_t mid = left + (right - left) / 2;
  1464.         build_tree(2 * tree_index + 1, left, mid);
  1465.         build_tree(2 * tree_index + 2, mid + 1, right);
  1466.         tree[tree_index] = func(tree[2 * tree_index + 1], tree[2 * tree_index + 2]);
  1467.     }
  1468.     T query(size_t tree_index, size_t left, size_t right) {
  1469.         if (query_left <= left && right <= query_right) return tree[tree_index];
  1470.         size_t mid = left + (right - left) / 2;
  1471.         if (mid < query_left || left > query_right) return query(2 * tree_index + 2, mid + 1, right);
  1472.         if (right < query_left || mid + 1 > query_right) return query(2 * tree_index + 1, left, mid);
  1473.         return func(query(2 * tree_index + 1, left, mid), query(2 * tree_index + 2, mid + 1, right));
  1474.     }
  1475.     void update(size_t tree_index, size_t left, size_t right) {
  1476.         if (left == right) {
  1477.             tree[tree_index] = update_new_value;
  1478.             return;
  1479.         }
  1480.         size_t mid = left + (right - left) / 2;
  1481.         if (update_index <= mid) update(2 * tree_index + 1, left, mid);
  1482.         else update(2 * tree_index + 2, mid + 1, right);
  1483.         tree[tree_index] = func(tree[2 * tree_index + 1], tree[2 * tree_index + 2]);
  1484.     }
  1485.  
  1486. public:
  1487.     vector<T> data;
  1488.  
  1489.     SegmentTree(const vector<T>& vec, const function<T(T, T)>& fun) : size(vec.size()), func(fun), data(vec.begin(), vec.end()) {
  1490.         tree.resize(4 * size);
  1491.         build_tree(0, 0, size - 1);
  1492.     }
  1493.  
  1494.     T query(ll left, ll right) {
  1495.         assert(left >= 0 && right < size && left <= right && "Given query range is invalid or out of range.");
  1496.         query_left = left;
  1497.         query_right = right;
  1498.         return query(0, 0, size - 1);
  1499.     }
  1500.     void update(ll index, T new_value) {
  1501.         assert(index >= 0 && index < size && "Given update index is out of range.");
  1502.         data[index] = new_value;
  1503.         update_index = index;
  1504.         update_new_value = new_value;
  1505.         update(0, 0, size - 1);
  1506.     }
  1507. };
  1508. // Segment Tree End
  1509.  
  1510. // Trie Start
  1511. class Trie {
  1512. public:
  1513.     ll size;
  1514.     ll cnt;
  1515.     vecll freq;
  1516.     str chars;
  1517.     unordered_map<char, ll> mp;
  1518.     vector<Trie*> child;
  1519.  
  1520.     Trie(const ll len = 26, str s = "abcdefghijklmnopqrstuvwxyz") : size(len), cnt(0), freq(size, 0), chars(s), child(size, nullptr) {
  1521.         for (ll i = 0; i < size; i++) mp[chars[i]] = i;
  1522.     }
  1523.  
  1524.     void insert(str s) {
  1525.         Trie* node = this;
  1526.         ll n = s.length();
  1527.         for (ll i = 0; i < n; i++) {
  1528.             ll mask = mp[s[i]];
  1529.             node->freq[mask]++;
  1530.             if (node->child[mask] == nullptr) node->child[mask] = new Trie();
  1531.             node = node->child[mask];
  1532.         }
  1533.         node->cnt++;
  1534.     }
  1535.     void remove(str s) {
  1536.         Trie* node = this;
  1537.         ll n = s.length();
  1538.         for (ll i = 0; i < n; i++) {
  1539.             ll mask = mp[s[i]];
  1540.             node->freq[mask]--;
  1541.             if (node->freq[mask] == 0) {
  1542.                 node->child[mask] = nullptr;
  1543.                 return;
  1544.             }
  1545.             node = node->child[mask];
  1546.         }
  1547.     }
  1548.     bool search(str s) {
  1549.         Trie* node = this;
  1550.         ll n = s.length();
  1551.         for (ll i = 0; i < n; i++) {
  1552.             ll mask = mp[s[i]];
  1553.             if (node->child[mask] == nullptr) return false;
  1554.             node = node->child[mask];
  1555.         }
  1556.         return true;
  1557.     }
  1558. };
  1559. // Trie End
  1560.  
  1561. // Monotonic Stack Start
  1562. class MonotonicStack {
  1563. private:
  1564.     const ll n;
  1565.     const bl eq_pmn, eq_pmx, eq_nmn, eq_nmx;
  1566.     vecll prev_min, prev_max, next_min, next_max;
  1567.  
  1568.     inline void check(ll inx) {
  1569.         assert(inx >= 0 && inx < n && "Index out of bounds");
  1570.     }
  1571.  
  1572. public:
  1573.     template<class T>
  1574.     MonotonicStack(vector<T>& arr, bl eql_pmn = 0, bl eql_pmx = 0, bl eql_nmn = 0, bl eql_nmx = 0) : n(arr.size()), eq_pmn(eql_pmn), eq_pmx(eql_pmx), eq_nmn(eql_nmn), eq_nmx(eql_nmx), prev_min(n, -1), prev_max(n, -1), next_min(n, n), next_max(n, n) {
  1575.         stack<pair<T, ll>> st1, st2;
  1576.         for (ll i = n - 1;i >= 0;--i) {
  1577.             while (!st1.empty() && st1.top().F + eq_pmn > arr[i]) {
  1578.                 prev_min[st1.top().S] = i;
  1579.                 st1.pop();
  1580.             }
  1581.             st1.push({ arr[i], i });
  1582.             while (!st2.empty() && st2.top().F < arr[i] + eq_pmx) {
  1583.                 prev_max[st2.top().S] = i;
  1584.                 st2.pop();
  1585.             }
  1586.             st2.push({ arr[i], i });
  1587.         }
  1588.         stack<pair<T, ll>>().swap(st1);
  1589.         stack<pair<T, ll>>().swap(st2);
  1590.         for (ll i = 0;i < n;++i) {
  1591.             while (!st1.empty() && st1.top().F + eq_nmn > arr[i]) {
  1592.                 next_min[st1.top().S] = i;
  1593.                 st1.pop();
  1594.             }
  1595.             st1.push({ arr[i], i });
  1596.             while (!st2.empty() && st2.top().F < arr[i] + eq_nmx) {
  1597.                 next_max[st2.top().S] = i;
  1598.                 st2.pop();
  1599.             }
  1600.             st2.push({ arr[i], i });
  1601.         }
  1602.     }
  1603.  
  1604.     ll prev_min_inx(ll inx) {
  1605.         check(inx);
  1606.         return prev_min[inx];
  1607.     }
  1608.     ll prev_max_inx(ll inx) {
  1609.         check(inx);
  1610.         return prev_max[inx];
  1611.     }
  1612.     ll next_min_inx(ll inx) {
  1613.         check(inx);
  1614.         return next_min[inx];
  1615.     }
  1616.     ll next_max_inx(ll inx) {
  1617.         check(inx);
  1618.         return next_max[inx];
  1619.     }
  1620. };
  1621. // Monotonic Stack End
  1622. // Classes End
  1623.  
  1624. //------------------------------------------------------------------------------------------
  1625.  
  1626. // Global Variables Start
  1627. PNC* pnc;
  1628. Prime* prime;
  1629.  
  1630. auto func = []() {
  1631.     ios_base::sync_with_stdio(false);
  1632.     cin.tie(nullptr);
  1633.     cout.tie(nullptr);
  1634.     // pnc = new PNC();
  1635.     // prime = new Prime();
  1636.     return 0;
  1637.     }();
  1638. // Global Variables End
  1639.  
  1640. // #define debug(...) 60
  1641.  
  1642. // /* // Solution Class Start
  1643. class Solution {
  1644. public:
  1645.  
  1646.     void solve(ll index) {
  1647.         //----------------------------------------------------------------------------------
  1648.  
  1649.         // debug("Case #",index,": ",newl);
  1650.         ll n,i,j,k;
  1651.         cin>>n;
  1652.  
  1653.         // cout<<"Case #"<<index<<": "<<ans<<newl;
  1654.  
  1655.         //----------------------------------------------------------------------------------
  1656.     }
  1657.  
  1658.     bool test_cases=true;
  1659. };
  1660. // Solution Class End
  1661.  
  1662. //------------------------------------------------------------------------------------------
  1663.  
  1664. // Main Function Start
  1665. int main() {
  1666.     Solution sol;
  1667.     ll test_cases = 1;
  1668.     if (sol.test_cases) cin >> test_cases;
  1669.     for (ll test_case = 1; test_case <= test_cases; ++test_case) sol.solve(test_case);
  1670.     return 0;
  1671. }
  1672. // Main Function End
  1673. // */ // Program End
  1674. //------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement