Advertisement
t_naveen_2308

Partial C++ Template

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