How to find the count of elements in a given range ( l, r ) in an array whose value is <= k where k is a given value? I have found the solutions using BIT and square root decomposition. Can anyone provide a code using segment trees? There are number of queries and in each query the value of k changes.
This question is from Numbers less than X of a range in an array - Codeforces
I was unable to understand. Can anyone help me?
Assume that there are no updates.
Please post the question link, so I know that you aren’t asking a question from an ongoing contest.
I have modified this question.
k is not constant for all queries
Oh, then it should be Segment Tree + Mo’s algorithm(which is sadly square root decomposition + offline queries)
The online and offline versions of this problem are very different. I think there are O(\log{n}) per query solutions for both, but offline is much simpler. Which do you want?
Isn’t offline Mo’s algorithm? And how will you do online? Please enlighten me
Offline: sort queries by k, and initialize a fenwick tree with an array of length n initially filled with zeros. Then, keep a pointer to a sorted version of the original array, and as elements become \leq k for the k of the current query, set the value at the element’s index in the fenwick tree to 1. Then just do a sum query on the query’s range.
Online: do the same thing, but with a persistent segment tree. Or use a wavelet tree (the link in the blog doesn’t work, but read the comments or look stuff up further). For updates, a mergesort tree will work (note that you’ll need a PBDS set in each node instead of a vector
).
2 Likes
For more Detail you can Read this comment