Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
- #define ll long long
- #define sz(s) (int)(s).size()
- #define all(s) (s).begin(),(s).end()
- using namespace std;
- void File();
- void sol();
- class WaveletTree {
- public:
- int low, high;
- WaveletTree *left, *right;
- vector<int> freq;
- // Constructor to build the Wavelet Tree
- WaveletTree(vector<int>& arr, int l, int r, int lo, int hi) : low(lo), high(hi), left(nullptr), right(nullptr) {
- if (lo == hi || l > r) return;
- int mid = (lo + hi) / 2;
- freq.reserve(r - l + 2);
- freq.push_back(0);
- for (int i = l; i <= r; i++) {
- freq.push_back(freq.back() + (arr[i] <= mid));
- }
- vector<int> leftArr, rightArr;
- for (int i = l; i <= r; i++) {
- if (arr[i] <= mid)
- leftArr.push_back(arr[i]);
- else
- rightArr.push_back(arr[i]);
- }
- if (!leftArr.empty()) {
- left = new WaveletTree(leftArr, 0, sz(leftArr) - 1, lo, mid);
- }
- if (!rightArr.empty()) {
- right = new WaveletTree(rightArr, 0, sz(rightArr) - 1, mid + 1, hi);
- }
- }
- // Get answer for the query
- int get_ans(int l, int r, int k) {
- if (r - l + 1 < k) return 1e9;
- if (low == high) return low;
- int leftCount = freq[r + 1] - freq[l];
- int ans = 1e9;
- if (left && leftCount >= k) {
- ans = min(ans, left->get_ans(freq[l], freq[r + 1] - 1, k));
- }
- if (right && r - l + 1 - leftCount >= k) {
- ans = min(ans, right->get_ans(l - freq[l], r - freq[r + 1], k));
- }
- return ans;
- }
- ~WaveletTree() {
- delete left;
- delete right;
- }
- };
- int main() {
- boAshraf
- File();
- int t = 1;
- // cin >> t;
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- int n,q;
- cin>>n>>q;
- vector<int>v(n);
- for(auto &it:v)cin>>it;
- vector<int>uni=v;
- sort(all(uni));
- uni.erase(unique(all(uni)),uni.end());
- vector<int>id=v;
- for(auto &it:id){
- it=lower_bound(all(uni),it)-uni.begin();
- }
- WaveletTree wlt(id,0,n-1,0,sz(uni)-1);
- int l,r,k,ans;
- while(q--){
- cin>>l>>r>>k;
- l--,r--;
- ans=wlt.get_ans(l,r,(r-l+1)/k+1);
- if(ans==1e9)ans=-1;
- else ans=uni[ans];
- cout<<ans<<'\n';
- }
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment