Advertisement
t_naveen_2308

Untitled

Mar 7th, 2024
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 27.88 KB | None | 0 0
  1. // Author : Naveen
  2.  
  3. // Program Start
  4. // Libraries and Namespace Start
  5. #include <bits/stdc++.h>
  6. #include <ext/pb_ds/assoc_container.hpp>
  7. #include <ext/pb_ds/tree_policy.hpp>
  8. using namespace std;
  9. using namespace __gnu_pbds;
  10. // Libraries and Namespace End
  11.  
  12. //----------------------------------------------------------------
  13.  
  14. // Important Shortcuts Start
  15. // Custom Hash Function Start
  16. struct custom_hash
  17. {
  18.     static uint64_t splitmix64(uint64_t x)
  19.     {
  20.         x += 0x9e3779b97f4a7c15;
  21.         x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
  22.         x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
  23.         return x ^ (x >> 31);
  24.     }
  25.  
  26.     size_t operator()(uint64_t x) const
  27.     {
  28.         static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
  29.         return splitmix64(x + FIXED_RANDOM);
  30.     }
  31. };
  32. // Custom Hash Function End
  33.  
  34. // Declarations Start
  35. typedef long long int ll;
  36. typedef unsigned long long int ull;
  37. typedef long double ld;
  38. typedef string str;
  39. typedef pair<ll, ll> pll;
  40. typedef tuple<ll, ll, ll> tll;
  41. typedef stack<ll> stll;
  42. typedef queue<ll> qll;
  43. typedef vector<bool> vb;
  44. typedef vector<ll> vll;
  45. typedef vector<ull> vull;
  46. typedef vector<pll> vpll;
  47. typedef vector<tll> vtll;
  48. typedef vector<ld> vld;
  49. typedef set<ll> sll;
  50. typedef unordered_set<ll, custom_hash> usll;
  51. typedef multiset<ll> msll;
  52. typedef unordered_multiset<ll, custom_hash> umsll;
  53. typedef map<ll, ll> mll;
  54. typedef unordered_map<ll, ll, custom_hash> umll;
  55. typedef multimap<ll, ll> mmll;
  56. typedef unordered_multimap<ll, ll, custom_hash> ummll;
  57. typedef priority_queue<ll> maxheap;
  58. typedef priority_queue<pll, vector<pll>, less<pll>> maxheappll;
  59. typedef priority_queue<ll, vector<ll>, greater<ll>> minheap;
  60. typedef priority_queue<pll, vector<pll>, greater<pll>> minheappll;
  61. typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbdssll;
  62. typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> pbdmsll;
  63. typedef tree<pll, null_type, less<pll>, rb_tree_tag, tree_order_statistics_node_update> pbdsmll;
  64. typedef tree<pll, null_type, less_equal<pll>, rb_tree_tag, tree_order_statistics_node_update> pbdsmmll;
  65. // Declarations End
  66.  
  67. // Constants Start
  68. const ull mod1 = 1000000007LL;
  69. const ull mod2 = 998244353LL;
  70. const ull maxif = 1000000LL;
  71. const ull inf = 9223372036854775807LL;
  72. const ll ninf = -9223372036854775807LL - 1;
  73. // Constants End
  74.  
  75. // Lib Functions Start
  76. #define spc ' '
  77. #define newl '\n'
  78. #define F first
  79. #define S second
  80. #define pb push_back
  81. #define mp make_pair
  82. #define mt make_tuple
  83. #define yes cout << "yes\n"
  84. #define no cout << "no\n"
  85. #define Yes cout << "Yes\n"
  86. #define No cout << "No\n"
  87. #define YES cout << "YES\n"
  88. #define NO cout << "NO\n"
  89. #define all(v) v.begin(), v.end()
  90. #define frin(i, s, e) for (ll i = s; i < e; i++)
  91. #define frdec(i, e, s) for (ll i = e; i > s; i--)
  92. #define frinv(i, s, e, v) for (ll i = s; i < e; i += v)
  93. #define frdecv(i, e, s, v) for (ll i = e; i > s; i -= v)
  94. // Lib Functions End
  95.  
  96. // Input and Output Functions Start
  97. template <class T>
  98. istream &operator>>(istream &is, vector<T> &a)
  99. {
  100.     for (T &x : a)
  101.         is >> x;
  102.     return is;
  103. }
  104.  
  105. inline void yn(bool con)
  106. {
  107.     cout << (con ? "yes" : "no") << '\n';
  108. }
  109. inline void Yn(bool con)
  110. {
  111.     cout << (con ? "Yes" : "No") << '\n';
  112. }
  113. inline void YN(bool con)
  114. {
  115.     cout << (con ? "YES" : "NO") << '\n';
  116. }
  117.  
  118. template <class T>
  119. inline void print(const T &val)
  120. {
  121.     cout << val << ' ';
  122. }
  123. template <class T>
  124. void print(const vector<T> &vec)
  125. {
  126.     for (T i : vec)
  127.         cout << i << ' ';
  128. }
  129.  
  130. template <class T>
  131. inline void println(const T &val)
  132. {
  133.     cout << val << '\n';
  134. }
  135. template <class T>
  136. void println(const vector<T> &vec)
  137. {
  138.     for (T i : vec)
  139.         cout << i << ' ';
  140.     cout << '\n';
  141. }
  142.  
  143. template <class T, class V>
  144. ostream &operator<<(ostream &os, const pair<T, V> &p)
  145. {
  146.     os << "(" << p.F << ", " << p.S << ")";
  147.     return os;
  148. }
  149. template <size_t Index, typename... Types>
  150. typename enable_if<Index == sizeof...(Types)>::type
  151. printuplehelper(ostream &os, const tuple<Types...> &) {}
  152. template <size_t Index, typename... Types>
  153.     typename enable_if < Index<sizeof...(Types)>::type
  154.                          printuplehelper(ostream &os, const tuple<Types...> &t)
  155. {
  156.     os << get<Index>(t);
  157.     if (Index + 1 < sizeof...(Types))
  158.         os << ", ";
  159.     printuplehelper<Index + 1>(os, t);
  160. }
  161. template <typename... Types>
  162. ostream &operator<<(ostream &os, const tuple<Types...> &t)
  163. {
  164.     os << "(";
  165.     printuplehelper<0>(os, t);
  166.     os << ")";
  167.     return os;
  168. }
  169. template <class T>
  170. ostream &operator<<(ostream &os, const vector<T> &vec)
  171. {
  172.     size_t c = 0;
  173.     const size_t n = vec.size();
  174.     os << "[";
  175.     for (T i : vec)
  176.         os << i << (++c < n ? ", " : "");
  177.     os << "]";
  178.     return os;
  179. }
  180. template <class T>
  181. ostream &operator<<(ostream &os, const set<T> &seti)
  182. {
  183.     size_t c = 0;
  184.     const size_t n = seti.size();
  185.     os << "{";
  186.     for (T i : seti)
  187.         os << i << (++c < n ? ", " : "");
  188.     os << "}";
  189.     return os;
  190. }
  191. template <class T>
  192. ostream &operator<<(ostream &os, const multiset<T> &seti)
  193. {
  194.     size_t c = 0;
  195.     const size_t n = seti.size();
  196.     os << "{";
  197.     for (T i : seti)
  198.         os << i << (++c < n ? ", " : "");
  199.     os << "}";
  200.     return os;
  201. }
  202. template <class T, class V>
  203. ostream &operator<<(ostream &os, const map<T, V> dict)
  204. {
  205.     size_t c = 0;
  206.     const size_t n = dict.size();
  207.     os << "{";
  208.     for (auto it : dict)
  209.         os << it.first << ": " << it.second << (++c < n ? ", " : "");
  210.     os << "}";
  211.     return os;
  212. }
  213. template <class T, class V>
  214. ostream &operator<<(ostream &os, const unordered_map<T, V> dict)
  215. {
  216.     size_t c = 0;
  217.     const size_t n = dict.size();
  218.     os << "{";
  219.     for (auto it : dict)
  220.         os << it.first << ": " << it.second << (++c < n ? ", " : "");
  221.     os << "}";
  222.     return os;
  223. }
  224. // Input and Output Functions End
  225. // Important Shortcuts End
  226.  
  227. //----------------------------------------------------------------
  228.  
  229. // Basic Functions Start
  230. // String Operator Overload Start
  231. template <class T>
  232. string operator*(const string &str, const T &n)
  233. {
  234.     string res;
  235.     res.reserve(str.size() * n);
  236.     for (T i = 0; i < n; ++i)
  237.         res += str;
  238.     return res;
  239. }
  240. // String Operator Overload End
  241.  
  242. // Min Function Start
  243. template <class T>
  244. inline T min(const vector<T> &vec)
  245. {
  246.     return *min_element(vec.begin(), vec.end());
  247. }
  248. // Min Function End
  249.  
  250. // Max Function Start
  251. template <class T>
  252. inline T max(const vector<T> &vec)
  253. {
  254.     return *max_element(vec.begin(), vec.end());
  255. }
  256. // Max Function End
  257.  
  258. // Sum Function Start
  259. template <class T>
  260. inline T sum(const T &val)
  261. {
  262.     return val;
  263. }
  264. template <class T, class... Args>
  265. T sum(const T &val, Args &&...args)
  266. {
  267.     return val + sum(forward<Args>(args)...);
  268. }
  269. template <class T>
  270. inline T sum(const vector<T> &vec)
  271. {
  272.     return accumulate(vec.begin(), vec.end(), T(0));
  273. }
  274. // Sum Function End
  275.  
  276. // Binary Start
  277. template <class T>
  278. string bin(const T &dn)
  279. {
  280.     string binstr = bitset<64>(dn).to_string();
  281.     ull firstone = binstr.find('1');
  282.     if (firstone != string::npos)
  283.     {
  284.         binstr = binstr.substr(firstone);
  285.         return binstr;
  286.     }
  287.     return "0";
  288. }
  289.  
  290. ull int2(const string &binstr)
  291. {
  292.     bitset<64> bits(binstr);
  293.     ull dn = static_cast<ull>(bits.to_ulong());
  294.     return dn;
  295. }
  296. // Binary End
  297.  
  298. // Squareroot Start
  299. inline ull sqrtint(ll n)
  300. {
  301.     if (n < 0)
  302.         throw runtime_error("The number can't be negative.");
  303.     return static_cast<ull>(sqrt(n));
  304. }
  305.  
  306. ull sqrtintu(ll n)
  307. {
  308.     if (n < 0)
  309.         throw runtime_error("The number can't be negative.");
  310.     ull k = sqrt(n);
  311.     return k * k == n ? k : k + 1;
  312. }
  313. // Squareroot End
  314.  
  315. // Map Computation Start
  316. template <class T>
  317. void mapcom(map<T, ll> &ma, const vector<T> &vec)
  318. {
  319.     for (T i : vec)
  320.         ma[i]++;
  321. }
  322. // Map Computation End
  323.  
  324. // Binary Exponentiation Start
  325. ull power(ull b, ull p)
  326. {
  327.     ull res = 1;
  328.     while (p > 0)
  329.     {
  330.         if (p & 1)
  331.             res = res * b;
  332.         b = b * b;
  333.         p >>= 1;
  334.     }
  335.     return res;
  336. }
  337. ull power(ull b, ull p, const ull mod)
  338. {
  339.     ull res = 1;
  340.     b %= mod;
  341.     while (p > 0)
  342.     {
  343.         if (p & 1)
  344.             res = res * b % mod;
  345.         b = b * b % mod;
  346.         p >>= 1;
  347.     }
  348.     return res;
  349. }
  350. // Binary Exponentiation End
  351.  
  352. // Prime Number Start
  353. bool isprime(ll n, bool p)
  354. {
  355.     if (n <= 0)
  356.         throw runtime_error("The given number can't be negative.");
  357.     if (n == 1)
  358.         return false;
  359.     if (n <= 3)
  360.         return true;
  361.     if (n % 2 == 0 || n % 3 == 0)
  362.         return false;
  363.     for (ll i = 5; i < (int)sqrt(n) + 1; i += 6)
  364.         if (n % i == 0 || n % (i + 2) == 0)
  365.             return false;
  366.     return true;
  367. }
  368. bool isprime(ll n)
  369. {
  370.     if (n <= 0)
  371.         throw runtime_error("The given number can't be negative.");
  372.     if (n == 1)
  373.         return false;
  374.     if (n <= 3)
  375.         return true;
  376.     if (n % 2 == 0 || n % 3 == 0)
  377.         return false;
  378.     ull d = n - 1;
  379.     while (d % 2 == 0)
  380.         d /= 2;
  381.     auto miller = [&](ull a)
  382.     {
  383.         if (a % n == 0)
  384.             return true;
  385.         ull x = power(a, d, n);
  386.         if (x == 1 || x == n - 1)
  387.             return true;
  388.         ull c = d;
  389.         while (c < n - 1)
  390.         {
  391.             x = x * x % n;
  392.             if (x == n - 1)
  393.                 return true;
  394.             c <<= 1;
  395.         }
  396.         return false;
  397.     };
  398.     vector<ull> bases64 = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
  399.     vector<ull> bases32 = {2, 7, 61};
  400.     vector<ull> &bases = n <= 4294967296ull ? bases32 : bases64;
  401.     for (ull base : bases)
  402.         if (!miller(base))
  403.             return false;
  404.     return true;
  405. }
  406.  
  407. void primes(vector<ll> &prime, const ull size = maxif)
  408. {
  409.     ull i, j;
  410.     vector<bool> primeis(size + 1, true);
  411.     primeis[0] = false;
  412.     primeis[1] = false;
  413.     for (i = 2; i <= sqrtintu(size); ++i)
  414.         if (primeis[i])
  415.             for (j = i * i; j <= size; j += i)
  416.                 primeis[j] = false;
  417.     for (i = 2; i <= size; ++i)
  418.         if (primeis[i])
  419.             prime.pb(i);
  420. }
  421. // Prime Number End
  422.  
  423. // KMP Algorithm Start
  424. ll substrisin(const string &text, const string &pattern)
  425. {
  426.     const size_t m = pattern.size();
  427.     const size_t n = text.size();
  428.     vll lps(m, 0);
  429.     ll len = 0, i = 1, j;
  430.     while (i < m)
  431.     {
  432.         if (pattern[i] == pattern[len])
  433.         {
  434.             len++;
  435.             lps[i++] = len;
  436.         }
  437.         else
  438.         {
  439.             if (len != 0)
  440.                 len = lps[len - 1];
  441.             else
  442.                 lps[i++] = 0;
  443.         }
  444.     }
  445.     i = 0, j = 0;
  446.     while (i < n)
  447.     {
  448.         if (pattern[j] == text[i])
  449.         {
  450.             ++i;
  451.             ++j;
  452.         }
  453.         if (j == m)
  454.             return i - j;
  455.         else if (i < n && pattern[j] != text[i])
  456.         {
  457.             if (j != 0)
  458.                 j = lps[j - 1];
  459.             else
  460.                 ++i;
  461.         }
  462.     }
  463.     return -1;
  464. }
  465. // KMP Algorithm End
  466. // Basic Functions End
  467.  
  468. //-----------------------------------------------------------------
  469.  
  470. // Modular Arithmetic Start
  471. // Modinv Function Start
  472. ll modinv(ll n, const ll mod, ll p)
  473. {
  474.     if (n < 0)
  475.         throw runtime_error("The number can't be negative.");
  476.     ll t1 = 0, t2 = 1, r1 = mod, r2 = n, q, temp;
  477.     while (r2)
  478.     {
  479.         q = r1 / r2;
  480.         temp = t1;
  481.         t1 = t2;
  482.         t2 = temp - q * t1;
  483.         temp = r1;
  484.         r1 = r2;
  485.         r2 = temp - q * r1;
  486.     }
  487.     if (r1 > 1)
  488.         throw runtime_error("Modular inverse does not exis.");
  489.     return (t1 % mod + mod) % mod;
  490. }
  491. inline ll modinv(ll n, const ll mod = mod1)
  492. {
  493.     if (n < 0)
  494.         throw runtime_error("The number can't be negative.");
  495.     return power(n, mod - 2, mod);
  496. }
  497. // Modinv Function End
  498.  
  499. // Permutations and Combinations Start
  500. inline ull fact(ll n)
  501. {
  502.     if (n < 0)
  503.         throw runtime_error("The number can't be negative.");
  504.     ull facto = 1;
  505.     for (ull i = 1; i <= n; ++i)
  506.         facto *= i;
  507.     return facto;
  508. }
  509. inline ull fact(ll n, const ull mod)
  510. {
  511.     if (n < 0)
  512.         throw runtime_error("The number can't be negative.");
  513.     ull ans = 1;
  514.     for (ull i = 1; i <= n; ++i)
  515.         ans = ans * i % mod;
  516.     return ans;
  517. }
  518.  
  519. inline void factcom(vector<ll> &v)
  520. {
  521.     v[0] = 1;
  522.     const size_t n = v.size();
  523.     for (size_t i = 1; i < n; ++i)
  524.         v[i] = i * v[i - 1];
  525. }
  526. inline void factcom(vector<ll> &v, const ll mod)
  527. {
  528.     v[0] = 1;
  529.     const size_t n = v.size();
  530.     for (size_t i = 1; i < n; ++i)
  531.         v[i] = i * v[i - 1] % mod;
  532. }
  533.  
  534. inline ull perm(ll n, ll r)
  535. {
  536.     if (n < 0 || r < 0)
  537.         throw runtime_error("The numbers can't be negative.");
  538.     ull ans = 1;
  539.     for (ull i = n - r + 1; i <= n; ++i)
  540.         ans *= i;
  541.     return ans;
  542. }
  543. inline ull perm(ll n, ll r, const ull mod)
  544. {
  545.     if (n < 0 || r < 0)
  546.         throw runtime_error("The numbers can't be negative.");
  547.     ull ans = 1;
  548.     for (ull i = n - r + 1; i <= n; ++i)
  549.         ans = ans * i % mod;
  550.     return ans;
  551. }
  552.  
  553. ull comb(ll n, ll r)
  554. {
  555.     if (n < 0 || r < 0)
  556.         throw runtime_error("The numbers can't be negative.");
  557.     ull num = 1, den = 1;
  558.     if (r > n / 2)
  559.         r = n - r;
  560.     n++;
  561.     for (ull i = 1; i <= r; ++i)
  562.     {
  563.         num *= n - i;
  564.         den *= i;
  565.     }
  566.     return num / den;
  567. }
  568. ull comb(ll n, ll r, const ull mod, bool p = 0)
  569. {
  570.     if (n < 0 || r < 0)
  571.         throw runtime_error("The numbers can't be negative.");
  572.     ull num = 1, den = 1;
  573.     if (r > n / 2)
  574.         r = n - r;
  575.     n++;
  576.     for (ull i = 1; i <= r; ++i)
  577.     {
  578.         num = num * (n - i) % mod;
  579.         den = den * i % mod;
  580.     }
  581.     return num * ((!p) ? modinv(den, mod) : modinv(den, mod, 1)) % mod;
  582. }
  583.  
  584. ull fastfib(ll n)
  585. {
  586.     if (n < 0)
  587.         throw runtime_error("The numbers can't be negative.");
  588.     ull a0 = 0, a1 = 1, f2, f21, t;
  589.     for (ll i = 61; i >= 0; i--)
  590.     {
  591.         f2 = (a0 * (2 * a1 - a0));
  592.         f21 = (a0 * a0 + a1 * a1);
  593.         if (n & (1LL << i))
  594.         {
  595.             a0 = f21;
  596.             a1 = f2 + f21;
  597.         }
  598.         else
  599.         {
  600.             a0 = f2;
  601.             a1 = f21;
  602.         }
  603.     }
  604.     return a0;
  605. }
  606. ull fastfib(ll n, const ull mod)
  607. {
  608.     if (n < 0)
  609.         throw runtime_error("The numbers can't be negative.");
  610.     ull a0 = 0, a1 = 1, f2, f21, t;
  611.     for (ll i = 61; i >= 0; i--)
  612.     {
  613.         f2 = (a0 * (2 * a1 - a0)) %mod;
  614.         f21 = (a0 * a0 + a1 * a1)%mod;
  615.         if (n & (1LL << i))
  616.         {
  617.             a0 = f21;
  618.             a1 = (f2 + f21)%mod;
  619.         }
  620.         else
  621.         {
  622.             a0 = f2;
  623.             a1 = f21;
  624.         }
  625.     }
  626.     return a0 % mod;
  627. }
  628. // Permuatations and Combinations End
  629. // Modular Arithmetic End
  630.  
  631. // Data Structures Start
  632. // Disjoint Set Union Start
  633. class DisjointSet
  634. {
  635. private:
  636.     vll parent, depth, setsize, maxset, minset;
  637.     ull numsets;
  638.  
  639. public:
  640.     DisjointSet() {}
  641.  
  642.     DisjointSet(ll n, ll start = 1)
  643.     {
  644.         init(n, start);
  645.     }
  646.  
  647.     void init(ll n, ll start = 1)
  648.     {
  649.         numsets = n;
  650.         n += start;
  651.         parent.assign(n, 0);
  652.         maxset.assign(n, 0);
  653.         minset.assign(n, 0);
  654.         for (ll i = start; i < n; i++)
  655.             parent[i] = maxset[i] = minset[i] = i;
  656.         depth.assign(n, 0);
  657.         setsize.assign(n, 1);
  658.     }
  659.  
  660.     ll findset(ll n)
  661.     {
  662.         return parent[n] = (parent[n] == n ? n : findset(parent[n]));
  663.     }
  664.     ll findset(ll n, bool p)
  665.     {
  666.         stack<ll> st;
  667.         ll v;
  668.         while (n != parent[n])
  669.         {
  670.             st.push(n);
  671.             n = parent[n];
  672.         }
  673.         while (!st.empty())
  674.         {
  675.             v = st.top();
  676.             st.pop();
  677.             parent[v] = n;
  678.         }
  679.         return n;
  680.     }
  681.  
  682.     bool issameset(ll a, ll b)
  683.     {
  684.         return findset(a) == findset(b);
  685.     }
  686.  
  687.     void unionset(ll a, ll b)
  688.     {
  689.         ll x = findset(a), y = findset(b);
  690.         if (x == y)
  691.             return;
  692.         if (depth[x] > depth[y])
  693.             swap(x, y);
  694.         if (depth[x] == depth[y])
  695.             depth[y]++;
  696.         parent[x] = y;
  697.         setsize[y] += setsize[x];
  698.         minset[y] = min(minset[y], minset[x]);
  699.         maxset[y] = max(maxset[y], maxset[x]);
  700.         numsets--;
  701.     }
  702.  
  703.     ll numofsets()
  704.     {
  705.         return numsets;
  706.     }
  707.  
  708.     ll sizeofset(ll n)
  709.     {
  710.         return setsize[findset(n)];
  711.     }
  712.  
  713.     ll maxofset(ll n)
  714.     {
  715.         return maxset[findset(n)];
  716.     }
  717.  
  718.     ll minofset(ll n)
  719.     {
  720.         return minset[findset(n)];
  721.     }
  722. };
  723. // Disjoin Set Union End
  724.  
  725. // Segment Tree Start
  726. template <class T>
  727. class SegmentTree
  728. {
  729. private:
  730.     const function<T(T, T)> &func;
  731.     vector<T> tree;
  732.     const size_t size;
  733.     size_t queryLeft, queryRight, updateIndex, updateNewValue;
  734.  
  735.     void buildTree(size_t treeIndex, size_t left, size_t right)
  736.     {
  737.         if (left == right)
  738.         {
  739.             tree[treeIndex] = data[left];
  740.             return;
  741.         }
  742.         size_t mid = left + (right - left) / 2;
  743.         buildTree(2 * treeIndex + 1, left, mid);
  744.         buildTree(2 * treeIndex + 2, mid + 1, right);
  745.         tree[treeIndex] = func(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);
  746.     }
  747.  
  748.     T query(size_t treeIndex, size_t left, size_t right)
  749.     {
  750.         if (queryLeft <= left && right <= queryRight)
  751.             return tree[treeIndex];
  752.         size_t mid = left + (right - left) / 2;
  753.         if (queryRight <= mid)
  754.             return query(2 * treeIndex + 1, left, mid);
  755.         if (queryLeft > mid)
  756.             return query(2 * treeIndex + 2, mid + 1, right);
  757.         return func(query(2 * treeIndex + 1, left, mid), query(2 * treeIndex + 2, mid + 1, right));
  758.     }
  759.  
  760.     void update(size_t treeIndex, size_t left, size_t right)
  761.     {
  762.         if (left == right)
  763.         {
  764.             tree[treeIndex] = updateNewValue;
  765.             return;
  766.         }
  767.         size_t mid = left + (right - left) / 2;
  768.         if (updateIndex <= mid)
  769.             update(2 * treeIndex + 1, left, mid);
  770.         else
  771.             update(2 * treeIndex + 2, mid + 1, right);
  772.         tree[treeIndex] = func(tree[2 * treeIndex + 1], tree[2 * treeIndex + 2]);
  773.     }
  774.  
  775. public:
  776.     vector<T> data;
  777.  
  778.     SegmentTree(const vector<T> &vec, const function<T(T, T)> &fun) : size(vec.size()), func(fun), data(vec.begin(), vec.end())
  779.     {
  780.         tree.assign(2 * size - 1, 0);
  781.         buildTree(0, 0, size - 1);
  782.     }
  783.  
  784.     T query(ll left, ll right)
  785.     {
  786.         if (left > right || left < 0 || right >= size)
  787.             throw runtime_error("Given query range is invalid or out of range.");
  788.         queryLeft = left;
  789.         queryRight = right;
  790.         return query(0, 0, size - 1);
  791.     }
  792.  
  793.     void update(ll index, T newValue)
  794.     {
  795.         if (index < 0 || index >= size)
  796.             throw runtime_error("Given update index is out of range.");
  797.         data[index] = newValue;
  798.         updateIndex = index;
  799.         updateNewValue = newValue;
  800.         update(0, 0, size - 1);
  801.     }
  802. };
  803. // Segment Tree End
  804.  
  805. // Graphs Start
  806. // Unweighted Graphs Start
  807. class UnweightedGraph
  808. {
  809. private:
  810.     ll count;
  811.  
  812.     void dfspr(ll src)
  813.     {
  814.         visited[src] = true;
  815.         pre[src] = count;
  816.         count++;
  817.         for (auto it : alist[src])
  818.         {
  819.             if (!visited[it])
  820.             {
  821.                 parent[it] = src;
  822.                 dfspr(it);
  823.             }
  824.         }
  825.         post[src] = count;
  826.         count++;
  827.     }
  828.  
  829. public:
  830.     vector<vll> alist;
  831.     vb visited;
  832.     vll level, component, topoorder, pathlen, parent, pre, post;
  833.     ll start, end, numofcomp;
  834.  
  835.     UnweightedGraph(const vector<vll> &alis, ll star = 1)
  836.     {
  837.         alist = alis;
  838.         start = star;
  839.         end = alis.size() + start;
  840.     }
  841.  
  842.     void dfs(ll src, bool iter = true)
  843.     {
  844.         visited.assign(end, false);
  845.         parent.assign(end, -1);
  846.         pre.assign(end, -1);
  847.         post.assign(end, -1);
  848.         if (iter)
  849.         {
  850.             ll cou = 0;
  851.             stack<ll> st;
  852.             ll u;
  853.             bool flag;
  854.             st.push(src);
  855.             while (!st.empty())
  856.             {
  857.                 u = st.top();
  858.                 if (!visited[u])
  859.                 {
  860.                     visited[u] = true;
  861.                     pre[u] = cou;
  862.                     cou++;
  863.                 }
  864.                 flag = true;
  865.                 for (ll v : alist[u])
  866.                 {
  867.                     if (!visited[v])
  868.                     {
  869.                         parent[v] = u;
  870.                         st.push(v);
  871.                         flag = false;
  872.                         break;
  873.                     }
  874.                 }
  875.                 if (flag)
  876.                 {
  877.                     post[u] = cou;
  878.                     cou++;
  879.                     st.pop();
  880.                 }
  881.             }
  882.         }
  883.         else
  884.         {
  885.             count = 0;
  886.             dfspr(src);
  887.         }
  888.     }
  889.  
  890.     void bfs(ll src)
  891.     {
  892.         level.assign(end, -1);
  893.         parent.assign(end, -1);
  894.         queue<ll> que;
  895.         que.push(src);
  896.         level[src] = 0;
  897.         ll v;
  898.         while (!que.empty())
  899.         {
  900.             v = que.front();
  901.             que.pop();
  902.             for (auto it : alist[v])
  903.             {
  904.                 if (level[it] == -1)
  905.                 {
  906.                     level[it] = level[v] + 1;
  907.                     parent[it] = v;
  908.                     que.push(it);
  909.                 }
  910.             }
  911.         }
  912.     }
  913.  
  914.     void components()
  915.     {
  916.         component.assign(end, -1);
  917.         ll seen = start, src, i;
  918.         numofcomp = 0;
  919.         while (seen < end)
  920.         {
  921.             src = -1;
  922.             for (i = start; i < end; i++)
  923.             {
  924.                 if (component[i] == -1)
  925.                 {
  926.                     src = i;
  927.                     break;
  928.                 }
  929.             }
  930.             bfs(src);
  931.             for (auto it : level)
  932.             {
  933.                 if (level[it] != -1)
  934.                 {
  935.                     component[it] = numofcomp;
  936.                     seen++;
  937.                 }
  938.             }
  939.             numofcomp++;
  940.         }
  941.     }
  942.  
  943.     void topologicalorder()
  944.     {
  945.         vll indegree(end, 0);
  946.         pathlen.assign(end, 0);
  947.         ll i;
  948.         for (i = start; i < end; i++)
  949.         {
  950.             for (auto it : alist[i])
  951.             {
  952.                 indegree[it]++;
  953.             }
  954.         }
  955.         queue<ll> que;
  956.         for (i = start; i < end; i++)
  957.             if (indegree[i] == 0)
  958.                 que.push(i);
  959.         ll v;
  960.         while (!que.empty())
  961.         {
  962.             v = que.front();
  963.             que.pop();
  964.             topoorder.pb(v);
  965.             indegree[v] = -1;
  966.             for (auto it : alist[v])
  967.             {
  968.                 indegree[it]--;
  969.                 pathlen[it] = max(pathlen[it], pathlen[v] + 1);
  970.                 if (indegree[it] == 0)
  971.                     que.push(it);
  972.             }
  973.         }
  974.     }
  975. };
  976. // Unweighted Graphs End
  977.  
  978. // Weighted Graphs Start
  979. class WeightedGraph
  980. {
  981. public:
  982.     vector<vpll> wlist;
  983.     vector<vll> distancefw;
  984.     DisjointSet component;
  985.     vpll edge;
  986.     vll distance;
  987.     ll start, end;
  988.  
  989.     WeightedGraph(const vector<vpll> &wlis, ll star = 1)
  990.     {
  991.         wlist = wlis;
  992.         start = star;
  993.         end = wlis.size() + star;
  994.     }
  995.  
  996.     void dijkstra(ll src)
  997.     {
  998.         vb visited(end, false);
  999.         distance.assign(end, inf);
  1000.         distance[src] = 0;
  1001.         minheappll heap;
  1002.         heap.push({0, src});
  1003.         ll nextv;
  1004.         while (!heap.empty())
  1005.         {
  1006.             nextv = heap.top().S;
  1007.             heap.pop();
  1008.             if (visited[nextv])
  1009.                 continue;
  1010.             visited[nextv] = true;
  1011.             for (auto it : wlist[nextv])
  1012.             {
  1013.                 if (!visited[it.F] && distance[nextv] + it.S < distance[it.F])
  1014.                 {
  1015.                     distance[it.F] = distance[nextv] + it.S;
  1016.                     heap.push({distance[it.F], it.F});
  1017.                 }
  1018.             }
  1019.         }
  1020.     }
  1021.  
  1022.     void bellmanford(ll src)
  1023.     {
  1024.         distance.assign(end, inf);
  1025.         distance[src] = 0;
  1026.         ll i, u;
  1027.         for (i = start; i < end - 1; i++)
  1028.             for (u = start; u < end; u++)
  1029.                 for (auto it : wlist[u])
  1030.                     distance[it.F] = min(distance[it.F], distance[u] + it.S);
  1031.         bool flag = false;
  1032.         for (u = start; u < end; u++)
  1033.             for (auto it : wlist[u])
  1034.                 if (distance[u] + it.S < distance[it.F])
  1035.                     throw runtime_error("The graph has negative cycles.");
  1036.     }
  1037.  
  1038.     void floydwarshall()
  1039.     {
  1040.         distancefw.assign(end, vll(end, inf));
  1041.         ll i, j, k;
  1042.         for (i = start; i < end; i++)
  1043.             for (auto it : wlist[i])
  1044.                 distancefw[i][it.F] = it.S;
  1045.         for (i = start; i < end; i++)
  1046.             for (j = start; j < end; j++)
  1047.                 for (k = start; k < end; k++)
  1048.                     distancefw[j][k] = min(distancefw[j][k], distancefw[j][i] + distancefw[i][k]);
  1049.     }
  1050.  
  1051.     void prim()
  1052.     {
  1053.         vb visited(end, false);
  1054.         distance.assign(end, inf);
  1055.         distance[start] = 0;
  1056.         minheappll heap;
  1057.         heap.push({0, start});
  1058.         ll nextv;
  1059.         while (!heap.empty())
  1060.         {
  1061.             nextv = heap.top().S;
  1062.             if (visited[nextv])
  1063.                 continue;
  1064.             visited[nextv] = true;
  1065.             for (auto it : wlist[nextv])
  1066.             {
  1067.                 if (!visited[it.F] && it.S < distance[it.F])
  1068.                 {
  1069.                     distance[it.F] = it.S;
  1070.                     heap.push({it.S, it.F});
  1071.                 }
  1072.             }
  1073.         }
  1074.     }
  1075.  
  1076.     void kruskal()
  1077.     {
  1078.         component.init(end - start, start);
  1079.         set<tll> edges;
  1080.         ll u, v;
  1081.         for (u = start; u < end; u++)
  1082.             for (auto it : wlist[u])
  1083.                 edges.insert({it.S, u, it.F});
  1084.         for (auto it : edges)
  1085.         {
  1086.             u = get<1>(it);
  1087.             v = get<2>(it);
  1088.             if (component.issameset(u, v))
  1089.                 continue;
  1090.             edge.pb({u, v});
  1091.             component.unionset(u, v);
  1092.         }
  1093.     }
  1094. };
  1095. // Weighted Graphs End
  1096. // Graphs End
  1097. // Data Structures End
  1098.  
  1099. //----------------------------------------------------------------
  1100.  
  1101. // Solution Class Start
  1102. class Solution
  1103. {
  1104. public:
  1105.     void solve(ull index)
  1106.     {
  1107.         //----------------------------------------------------------------
  1108.  
  1109.         ll n, i, j, k;
  1110.         cin >> n;
  1111.         vll arr(n);
  1112.         cin >> arr;
  1113.         ll q;
  1114.         cin >> q;
  1115.         SegmentTree<ll> s1(arr, [](ll a, ll b){
  1116.             return a>b?a:b;
  1117.         });
  1118.         SegmentTree<ll> s2(arr, [](ll a, ll b){
  1119.             ll t;
  1120.             while(b)
  1121.             {
  1122.                 t = b;
  1123.                 b = a%b;
  1124.                 a = t;
  1125.             }
  1126.             return a;
  1127.         });
  1128.         ll l, r, maxi=0, ansl=0, ansr=0, val=0;
  1129.         while (q--)
  1130.         {
  1131.             cin >> l >> r;
  1132.             val = s1.query(l-1, r-1)/s2.query(l-1, r-1);
  1133.             if(val>maxi)
  1134.             {
  1135.                 maxi = val;
  1136.                 ansl = l;
  1137.                 ansr = r;
  1138.             }
  1139.         }
  1140.         cout<<ansl<<spc<<ansr<<spc<<maxi<<newl;
  1141.  
  1142.         // cout << "Case #" << index << ": " << ans << newl;
  1143.  
  1144.         //----------------------------------------------------------------
  1145.     }
  1146.  
  1147.     bool testCases = true;
  1148. };
  1149. // Solution Class End
  1150.  
  1151. // Main Function Start
  1152. int32_t main()
  1153. {
  1154.     Solution sol;
  1155.     ios_base::sync_with_stdio(false);
  1156.     cin.tie(nullptr);
  1157.     cout.tie(nullptr);
  1158.     ull test = 1;
  1159.     if (sol.testCases)
  1160.         cin >> test;
  1161.     for (ull i = 1; i <= test; i++)
  1162.         sol.solve(i);
  1163.     return 0;
  1164. }
  1165. // Main Function End
  1166. // Program End
  1167. //----------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement