Sreekar_0125

Untitled

Oct 15th, 2023
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4.  
  5. class RangeGcdST
  6. {
  7. public:
  8.     int n;
  9.     vector<int> v, tree;
  10.     void build(int low, int high, int ind)
  11.     {
  12.         if (low == high)
  13.         {
  14.             tree[ind] = v[low];
  15.             return;
  16.         }
  17.         int mid = (low + high) >> 1;
  18.  
  19.         build(low, mid, 2 * ind + 1);
  20.         build(mid + 1, high, 2 * ind + 2);
  21.  
  22.         tree[ind] = __gcd(tree[2 * ind + 1], tree[2 * ind + 2]);
  23.     }
  24.     RangeGcdST(vector<int> &v)
  25.     {
  26.         this->v = v;
  27.         this->n = v.size();
  28.         tree.resize(4 * n);
  29.         this->build(0, n - 1, 0);
  30.     }
  31.     int query(int low, int high, int l, int r, int ind)
  32.     {
  33.         int mid = (low + high) >> 1;
  34.         if (low > r || high < l)
  35.         {
  36.             return 0;
  37.         }
  38.         if (low >= l && high <= r)
  39.         {
  40.             return tree[ind];
  41.         }
  42.  
  43.         int left = query(low, mid, l, r, 2 * ind + 1);
  44.         int right = query(mid + 1, high, l, r, 2 * ind + 2);
  45.  
  46.         return __gcd(left, right);
  47.     }
  48. };
  49.  
  50. class RangeMaxST
  51. {
  52. public:
  53.     int n;
  54.     vector<int> v, tree;
  55.     void build(int low, int high, int ind)
  56.     {
  57.         if (low == high)
  58.         {
  59.             tree[ind] = v[low];
  60.             return;
  61.         }
  62.         int mid = (low + high) >> 1;
  63.  
  64.         build(low, mid, 2 * ind + 1);
  65.         build(mid + 1, high, 2 * ind + 2);
  66.  
  67.         tree[ind] = max(tree[2 * ind + 1], tree[2 * ind + 2]);
  68.     }
  69.     RangeMaxST(vector<int> &v)
  70.     {
  71.         this->v = v;
  72.         this->n = v.size();
  73.         tree.resize(4 * n);
  74.         this->build(0, n - 1, 0);
  75.     }
  76.     int query(int low, int high, int l, int r, int ind)
  77.     {
  78.         int mid = (low + high) >> 1;
  79.         if (low > r || high < l)
  80.         {
  81.             return LLONG_MIN;
  82.         }
  83.         if (low >= l && high <= r)
  84.         {
  85.             return tree[ind];
  86.         }
  87.  
  88.         int left = query(low, mid, l, r, 2 * ind + 1);
  89.         int right = query(mid + 1, high, l, r, 2 * ind + 2);
  90.  
  91.         return max(left, right);
  92.     }
  93. };
  94. void fast()
  95. {
  96.     ios_base::sync_with_stdio(false);
  97.     cin.tie(NULL);
  98.     cout.tie(NULL);
  99. }
  100.  
  101. void solve()
  102. {
  103.     int n;
  104.     cin >> n;
  105.  
  106.     vector<int> v(n);
  107.     for (int i = 0; i < n; i++)
  108.     {
  109.         cin >> v[i];
  110.     }
  111.  
  112.     RangeGcdST st1(v);
  113.     RangeMaxST st2(v);
  114.  
  115.     int G;
  116.     cin >> G;
  117.  
  118.     map<pair<int, int>, int> mp;
  119.     int maxans = 0;
  120.  
  121.     while (G--)
  122.     {
  123.         int l, r;
  124.         cin >> l >> r;
  125.         l--;
  126.         r--;
  127.  
  128.         int gcd = st1.query(0, n - 1, l, r, 0);
  129.         int maxi = st2.query(0, n - 1, l, r, 0);
  130.  
  131.         int val = maxi / gcd;
  132.         mp[{l + 1, r + 1}] = val;
  133.         maxans = max(maxans, val);
  134.     }
  135.     for (auto i : mp)
  136.     {
  137.         if (i.second == maxans)
  138.         {
  139.             cout << i.first.first << ' ' << i.first.second << ' ' << maxans << endl;
  140.             return;
  141.         }
  142.     }
  143. }
  144.  
  145. signed main()
  146. {
  147.     freopen("input.txt", "r", stdin);
  148.     freopen("output.txt", "w", stdout);
  149.     int t = 1;
  150.     cin >> t;
  151.     while (t--)
  152.     {
  153.         solve();
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment