AhmedAshraff

Untitled

Nov 26th, 2024
32
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.59 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
  3. #define ll long long
  4. #define sz(s) (int)(s).size()
  5. #define all(s) (s).begin(),(s).end()
  6. using namespace std;
  7. void File();
  8. void sol();
  9. class WaveletTree {
  10. public:
  11.     int low, high;
  12.     WaveletTree *left, *right;
  13.     vector<int> freq;
  14.  
  15.     // Constructor to build the Wavelet Tree
  16.     WaveletTree(vector<int>& arr, int l, int r, int lo, int hi) : low(lo), high(hi), left(nullptr), right(nullptr) {
  17.         if (lo == hi || l > r) return;
  18.  
  19.         int mid = (lo + hi) / 2;
  20.         freq.reserve(r - l + 2);
  21.         freq.push_back(0);
  22.  
  23.         for (int i = l; i <= r; i++) {
  24.             freq.push_back(freq.back() + (arr[i] <= mid));
  25.         }
  26.  
  27.         vector<int> leftArr, rightArr;
  28.         for (int i = l; i <= r; i++) {
  29.             if (arr[i] <= mid)
  30.                 leftArr.push_back(arr[i]);
  31.             else
  32.                 rightArr.push_back(arr[i]);
  33.         }
  34.  
  35.         if (!leftArr.empty()) {
  36.             left = new WaveletTree(leftArr, 0, sz(leftArr) - 1, lo, mid);
  37.         }
  38.         if (!rightArr.empty()) {
  39.             right = new WaveletTree(rightArr, 0, sz(rightArr) - 1, mid + 1, hi);
  40.         }
  41.     }
  42.  
  43.     // Get answer for the query
  44.     int get_ans(int l, int r, int k) {
  45.         if (r - l + 1 < k) return 1e9;
  46.         if (low == high) return low;
  47.  
  48.         int leftCount = freq[r + 1] - freq[l];
  49.         int ans = 1e9;
  50.  
  51.         if (left && leftCount >= k) {
  52.             ans = min(ans, left->get_ans(freq[l], freq[r + 1] - 1, k));
  53.         }
  54.         if (right && r - l + 1 - leftCount >= k) {
  55.             ans = min(ans, right->get_ans(l - freq[l], r - freq[r + 1], k));
  56.         }
  57.  
  58.         return ans;
  59.     }
  60.  
  61.     ~WaveletTree() {
  62.         delete left;
  63.         delete right;
  64.     }
  65. };
  66. int main() {
  67.     boAshraf
  68.     File();
  69.     int t = 1;
  70. //    cin >> t;
  71.     while (t--) {
  72.         sol();
  73.     }
  74.     return 0;
  75. }
  76.  
  77. void sol() {
  78.     int n,q;
  79.     cin>>n>>q;
  80.     vector<int>v(n);
  81.     for(auto &it:v)cin>>it;
  82.     vector<int>uni=v;
  83.     sort(all(uni));
  84.     uni.erase(unique(all(uni)),uni.end());
  85.     vector<int>id=v;
  86.     for(auto &it:id){
  87.         it=lower_bound(all(uni),it)-uni.begin();
  88.     }
  89.     WaveletTree wlt(id,0,n-1,0,sz(uni)-1);
  90.     int l,r,k,ans;
  91.     while(q--){
  92.         cin>>l>>r>>k;
  93.         l--,r--;
  94.         ans=wlt.get_ans(l,r,(r-l+1)/k+1);
  95.         if(ans==1e9)ans=-1;
  96.         else ans=uni[ans];
  97.         cout<<ans<<'\n';
  98.     }
  99. }
  100.  
  101. void File() {
  102. #ifndef ONLINE_JUDGE
  103.     freopen("input.txt", "r", stdin);
  104.     freopen("output.txt", "w", stdout);
  105. #endif
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment