AhmedAshraff

Untitled

Aug 1st, 2025
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.90 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. #define sz(s) (int)(s).size()
  6. #define all(s) s.begin(),s.end()
  7.  
  8. void Speed() {
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(NULL);
  11. }
  12.  
  13. template<typename T>
  14. struct sparse_table {
  15.     vector<vector<T>> sparseTable;
  16.     using F = function<T(T, T)>;
  17.     F merge;
  18.  
  19.     static int LOG2(int x) { //floor(log2(x))
  20.         return 31 - __builtin_clz(x);
  21.     }
  22.  
  23.     sparse_table() {}
  24.  
  25.     sparse_table(vector<T> &v, F merge) :
  26.             merge(merge) {
  27.         int n = v.size();
  28.         int logN = LOG2(n);
  29.         sparseTable = vector<vector<T>>(logN + 1);
  30.         sparseTable[0] = v;
  31.         for (int k = 1, len = 1; k <= logN; k++, len <<= 1) {
  32.             sparseTable[k].resize(n);
  33.             for (int i = 0; i + len < n; i++)
  34.                 sparseTable[k][i] = merge(sparseTable[k - 1][i],
  35.                                           sparseTable[k - 1][i + len]);
  36.         }
  37.     }
  38.  
  39.     T query(int l, int r) {
  40.         r -= 2;
  41.         if (l > r)return 0;
  42.         int k = LOG2(r - l + 1); // max k ==> 2^k <= length of range
  43. //check first 2^k from left and last 2^k from right //overlap
  44.         return merge(sparseTable[k][l], sparseTable[k][r - (1 << k) + 1]);
  45.     }
  46.  
  47.     T query_shifting(int l, int r) {
  48.         T res;
  49.         bool first = true;
  50.         for (int i = (int) sparseTable.size() - 1; i >= 0; i--)
  51.             if (l + (1 << i) - 1 <= r) {
  52.                 if (first)
  53.                     res = sparseTable[i][l];
  54.                 else
  55.                     res = merge(res, sparseTable[i][l]);
  56.                 first = false;
  57.                 l += (1 << i);
  58.             }
  59.         return res;
  60.     }
  61. };
  62.  
  63. sparse_table<int> sp;
  64. const int N = 1e5 + 5;
  65. int a[N];
  66. deque<int> idx[N];
  67. int freq[N];
  68. priority_queue<int>curr;
  69. struct Mo {
  70.     int n, sq;
  71.  
  72.     Mo(int n) : n(n), sq(sqrt(n)) {}
  73.  
  74.     struct query {
  75.         int l, r, id, block_id;
  76.  
  77.         query(int l, int r, int id, int sq) : l(l), r(r), id(id), block_id(l / sq) {}
  78.  
  79.         bool operator<(const query &other) const {
  80.             if (block_id == other.block_id) return r < other.r;
  81.             return block_id < other.block_id;
  82.         }
  83.     };
  84.  
  85.     vector<query> Q;
  86.  
  87.     void addQuery(int l, int r, int id) {
  88.         Q.emplace_back(l, r, id, sq);
  89.     }
  90.  
  91.     void add(int i, bool left) {
  92.         if (!i)return;
  93.         if (sz(idx[a[i]]) > 1) {
  94.             int x = sp.query(idx[a[i]].front(), idx[a[i]].back());
  95.             if (x > a[i])
  96.                 freq[x]--;
  97.         }
  98.         if (left)idx[a[i]].emplace_front(i);
  99.         else idx[a[i]].emplace_back(i);
  100.         if (sz(idx[a[i]]) > 1) {
  101.             int x = sp.query(idx[a[i]].front(), idx[a[i]].back());
  102.             if (x > a[i]) {
  103.                 if(!freq[x]++)curr.push(x);
  104.             }
  105.         }
  106.     }
  107.  
  108.     void remove(int i, bool left) {
  109.         if (!i)return;
  110.         if (sz(idx[a[i]]) > 1) {
  111.             int x = sp.query(idx[a[i]].front(), idx[a[i]].back());
  112.             if (x > a[i])
  113.                 freq[x]--;
  114.         }
  115.         if (left)idx[a[i]].pop_front();
  116.         else idx[a[i]].pop_back();
  117.         if (sz(idx[a[i]]) > 1) {
  118.             int x = sp.query(idx[a[i]].front(), idx[a[i]].back());
  119.             if (x > a[i])
  120.                 if(!freq[x]++)curr.push(x);
  121.         }
  122.     }
  123.  
  124.     vector<int> process() {
  125.         vector<int> ans(sz(Q));
  126.         sort(all(Q));
  127.         int curL = 0, curR = -1; // 1-based
  128.         for (auto [l, r, id, block_Id]: Q) {
  129.             while (curL > l) add(--curL, 1);
  130.             while (curR < r) add(++curR, 0);
  131.             while (curL < l) remove(curL++, 1);
  132.             while (curR > r) remove(curR--, 0);
  133.             while(freq[curr.top()]==0)curr.pop();
  134.             ans[id] = curr.top();
  135.         }
  136.         return ans;
  137.     }
  138. };
  139.  
  140. void solve() {
  141.     while(!curr.empty())curr.pop();
  142.     curr.push(0);
  143.     freq[0]=1;
  144.     int n;
  145.     cin >> n;
  146.     vector<int> ord, v;
  147.     for (int i = 1; i <= n; ++i) {
  148.         cin >> a[i];
  149.         ord.emplace_back(a[i]);
  150.     }
  151.     sort(all(ord));
  152.     ord.erase(unique(all(ord)), ord.end());
  153.     for (int i = 1; i <= n; i++) {
  154.         int id = lower_bound(all(ord), a[i]) - ord.begin();
  155.         a[i] = id + 1;
  156.         v.emplace_back(a[i]);
  157.     }
  158.     sp = sparse_table<int>(v, [&](const int &a, const int &b) -> int {
  159.         return max(a, b);
  160.     });
  161.     int q;
  162.     cin >> q;
  163.     Mo mo(n);
  164.     for (int i = 0; i < q; i++) {
  165.         int l, r;
  166.         cin >> l >> r;
  167.         mo.addQuery(l, r, i);
  168.     }
  169.     auto ans = mo.process();
  170.     for (auto it: ans)cout << (it ? ord[it - 1] : 0) << '\n';
  171.     for (auto it: v) {
  172.         idx[it].clear();
  173.         freq[it]=0;
  174.     }
  175. }
  176.  
  177. /*
  178.  2
  179.  4
  180.  2 1 3 2
  181.  2
  182.  2 4
  183.  1 4
  184.  8
  185.  1 10 2 3 2 6 3 6
  186.  4
  187.  1 5
  188.  1 8
  189.  3 6
  190.  3 8
  191.  
  192.  
  193.  
  194.  */
  195. int main() {
  196.     Speed();
  197.     int tc = 1;
  198.     cin >> tc;
  199.     while (tc--) {
  200.         solve();
  201.     }
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment