AhmedAshraff

Untitled

Jul 17th, 2024
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 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. struct Node {
  14.     vector<int> r, mex;
  15. } neutral;
  16.  
  17. struct segtree {
  18.     segtree *left = nullptr, *right = nullptr;
  19.  
  20.     Node node = {};
  21.  
  22.     int start, end;
  23.  
  24.     segtree(int l = 0, int r = 0) : start(l), end(r) {}
  25.  
  26.     void extend() {
  27.         if (left == nullptr) {
  28.             int mid = start + end >> 1;
  29.             left = new segtree(start, mid);
  30.             right = new segtree(mid + 1, end);
  31.         }
  32.     }
  33.  
  34.     Node pushup(Node a, Node b) {
  35.         Node ret;
  36.         int i = 0, j = 0, last = 0;
  37.         while(i < sz(a.r) || j < sz(b.r)){
  38.             if(j == sz(b.r) || (i < sz(a.r) && a.r[i] < b.r[j])){
  39.                 ret.r.push_back(a.r[i]);
  40.                 last = max(last, a.mex[i++]);
  41.                 ret.mex.push_back(last);
  42.             }
  43.             else{
  44.                 ret.r.push_back(b.r[j]);
  45.                 last = max(last, b.mex[j++]);
  46.                 ret.mex.push_back(last);    
  47.             }
  48.         }
  49.         return ret;
  50.     }
  51.    
  52.     void build(vector<vector<array<int, 2>>>& v) {
  53.         if (start == end) {
  54.             for(auto& [r, mex] : v[start]){
  55.                 node.r.push_back(r), node.mex.push_back(mex);
  56.             }
  57.             return;
  58.         }
  59.         extend();
  60.         left->build(v);
  61.         right->build(v);
  62.         node = pushup(left->node, right->node);
  63.     }
  64.    
  65.     int query(int l, int r) {
  66.         if (r < start || end < l)
  67.             return 0;
  68.         extend();
  69.         if (l <= start && end <= r){
  70.             int idx = upper_bound(all(node.r), r) - node.r.begin();
  71.             if(idx == 0) return 0;
  72.             return node.mex[--idx];
  73.         }
  74.         return max(left->query(l , r), right->query(l , r));
  75.     }
  76.  
  77.     ~segtree() {
  78.         if (left == nullptr)return;
  79.         delete left;
  80.         delete right;
  81.     }
  82. };
  83.  
  84. void solve() {
  85.     int n; cin >> n;
  86.     array<vector<int>, 2> a;
  87.     a[0] = a[1] = vector<int>(n);
  88.     for(int i = 0; i < 2; i++){
  89.         for(int j = 0; j < n; j++){
  90.             cin >> a[i][j];
  91.         }
  92.     }
  93.  
  94.     vector<vector<array<int, 2>>> v(n);
  95.     auto doWork = [&](){
  96.         vector<int> idx(n), freq1(n + 1), freq2(n + 1);
  97.         for(int i = 0; i < n; i++) idx[a[0][i]] = i;
  98.         int l = idx[0], r = idx[0];
  99.         freq1[0] = 1; freq2[a[1][l]] = 1;
  100.         int mex1 = 0, mex2 = 0;
  101.         while(freq1[mex1]) mex1++;
  102.         while(freq2[mex2]) mex2++;
  103.         v[l].push_back({r, abs(mex1 - mex2)});
  104.         for(int k = 1; k < n; k++){
  105.             int new_l = min(l, idx[k]), new_r = max(r, idx[k]);
  106.             for(int j = new_l; j < l; j++){
  107.                 freq1[a[0][j]] = 1;
  108.                 freq2[a[1][j]] = 1;        
  109.             }
  110.             for(int j = r + 1; j <= new_r; j++){
  111.                 freq1[a[0][j]] = 1;
  112.                 freq2[a[1][j]] = 1;            
  113.             }
  114.             l = new_l; r = new_r;
  115.             while(freq1[mex1]) mex1++;
  116.             while(freq2[mex2]) mex2++;
  117.             v[l].push_back({r, abs(mex1 - mex2)});
  118.         }
  119.     };
  120.     doWork();
  121.     swap(a[0], a[1]);
  122.     doWork();
  123.     for(int l = 0; l < n; l++) sort(all(v[l]));
  124.  
  125.     vector<tuple<int, int, int>> st;
  126.     for(int l = 0; l < n; l++){
  127.         int last_r = -1, last_mex = -1;
  128.         for(auto& [r, mex] : v[l]){
  129.             if(r == last_r && mex == last_mex) continue;
  130.             last_r = r; last_mex = mex;
  131.             st.push_back({l, r, mex});
  132.         }
  133.     }
  134.  
  135.     // segtree* root = new segtree(0, n - 1);
  136.     // root->build(v);
  137.     int q; cin >> q;
  138.     while(q--){
  139.         int l, r; cin >> l >> r;
  140.         l--; r--;
  141.         int ans = 0;
  142.         for(auto& [a, b, mex] : st){
  143.             if(a > r) break;
  144.             if(a >= l && b <= r) ans = max(ans, mex);
  145.         }
  146.         cout << ans << '\n';
  147.     }
  148. }  
  149.  
  150. int main() {
  151.     Speed();
  152.     int tc = 1;
  153.     cin >> tc;
  154.     while (tc--) {
  155.         solve();
  156.     }
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment