Ankit_132

Rank Queries

Jun 14th, 2023
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. #include <ext/pb_ds/assoc_container.hpp>
  4. #include <ext/pb_ds/tree_policy.hpp>
  5.  
  6. using namespace std;
  7. using namespace __gnu_pbds;
  8.  
  9. #define ll     long long
  10. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  11. #define ff     first
  12. #define ss     second
  13. #define pb     push_back
  14. #define ppb    pop_back
  15.  
  16. template <typename T> using Ordered_Multiset_Tree =
  17.         tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
  18.  
  19. int main()
  20. {
  21.     ios_base::sync_with_stdio(false);
  22.     cin.tie(NULL);
  23.     cout.tie(NULL);
  24.  
  25.     _test
  26.     {
  27.         int n, q;
  28.         cin>>n>>q;
  29.  
  30.         vector<int> a(n);
  31.         for(auto &e: a)  cin>>e;
  32.  
  33.         vector<pair<int, int>> queries(q);
  34.         for(auto &[e, f]: queries)  cin>>e>>f;
  35.  
  36.         vector<array<int, 3>> qer;
  37.         for(int i=0; i<q; i++)
  38.             qer.pb({queries[i].ff-1, queries[i].ss, i});
  39.  
  40.         sort(qer.begin(), qer.end());
  41.         Ordered_Multiset_Tree<int> prv, nxt;
  42.         vector<int> ans(q);
  43.  
  44.         for(auto e: a)      nxt.insert(e);
  45.  
  46.         int i = 0;
  47.         int j = 0;
  48.  
  49.         for(auto [k, r, ind]: qer)
  50.         {
  51.             while(i < k)
  52.                 prv.insert(a[i++]);
  53.  
  54.             while(j <= k)
  55.                 nxt.erase(nxt.upper_bound(a[j++]));
  56.  
  57.             auto possible = [&](int rem)
  58.             {
  59.                 int moreinPrv = prv.size() - prv.order_of_key(a[k]+1);
  60.                 int moreinNxt = nxt.size() - nxt.order_of_key(a[k]+1);
  61.  
  62.                 moreinPrv = max(0, moreinPrv-rem);
  63.                 moreinNxt = max(0, moreinNxt-rem);
  64.  
  65.                 return (moreinPrv + moreinNxt + 1 <= r);
  66.             };
  67.  
  68.             int val = n-1;
  69.             int low=0, high=n-1;
  70.  
  71.             while(low <= high)
  72.             {
  73.                 int mid = (low + high)/2;
  74.  
  75.                 if(possible(mid))
  76.                     val=mid, high=mid-1;
  77.                 else
  78.                     low=mid+1;
  79.             }
  80.  
  81.             ans[ind] = val;
  82.         }
  83.  
  84.         for(auto e: ans)
  85.             cout<<e<<"\n";
  86.     }
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment