Submission #968533

#TimeUsernameProblemLanguageResultExecution timeMemory
968533penguin133Index (COCI21_index)C++17
110 / 110
687 ms47360 KiB
// CPP program for querying in // wavelet tree Data Structure #include <bits/stdc++.h> using namespace std; #define N 200005 // Given Array int a[N]; // wavelet tree class struct wavelet_tree{ int lo, hi; wavelet_tree *l, *r; vector<int>b; wavelet_tree(int *from, int *to, int x, int y){ lo = x, hi = y; if(lo == hi || from >= to)return; int mid = (lo + hi)/2; auto f = [mid](int x){ return x <= mid; }; b.reserve(to-from+1); b.push_back(0); for(auto it = from;it != to;it++){ b.push_back(b.back() + f(*it)); } auto pivot = stable_partition(from, to, f); l = new wavelet_tree(from, pivot, lo, mid); r = new wavelet_tree(pivot, to, mid+1, hi); } int kth(int l, int r, int k){ if(l > r)return 0; if(lo == hi)return lo; int inleft = b[r] - b[l-1]; int lb = b[l-1]; int rb = b[r]; if(k <= inleft)return this->l->kth(lb+1, rb, k); return this->r->kth(l-lb, r-rb, k-inleft); } }; // Driver code int maxi, mini = 1e9; int main() { ios::sync_with_stdio(0);cin.tie(0); int n, q;cin >> n >> q; for(int i=1;i<=n;i++)cin >> a[i]; wavelet_tree hi(a+1, a + 1 + n, 0, 2e5); //cout << hi.kth(4, 5, 2) << '\n'; while(q--){ int l,r; cin >> l >> r; int s = 0, e = r-l+1, ans = 0; while(s <= e){ int m = (s + e)/2; if(hi.kth(l, r, (r-l+1) - m + 1) >= m)ans = m, s = m + 1; else e = m -1; } cout << ans << '\n'; } // count of elements less than 2 in range [1,3] //cout << obj.kOrLess(0, 3, 2) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...