Counting values greater than equal to x after increments

Consider an array of size n with initial 0 values. How many indices will contain value at least x after performing m range updates. In each of the m queries you are given a range from L to R and you have to add 1 to each index starting from L to R (both inclusive). Now, you are given q queries and in each query, a number x. Your task is to find out how many array indices have value greater than or equal to x. (the value of n , m , q can be upto 10^6)

Examples :

Input :  n = 4
         l[] = {1, 1, 3};
         r[] = {3, 2, 4};         
         x[] = {1, 4, 2};
Output :
Number of indexes with atleat 1 is 4
Number of indexes with atleat 4 is 0
Number of indexes with atleat 2 is 3

Explanation :
Initial array is {0, 0, 0, 0}
After first update : {1, 1, 1, 0}
After second update : {2, 2, 1, 0}
After third update : {2, 2, 2, 1}

Naive Approach : The trivial solution that comes to mind is to create an array of size n and for each update [L,R] add 1 to each array index within this range. Then for each x, count by traversing the whole array, the number of indices with value greater than or equal to x . However, we are given that the value of n and q is very large (upto 10^6), so for every query we cannot simply traverse the array and find out how many indices have at-least x as their value. In the worst case time complexity is O(nq), which is quite inefficient.

Efficient Approach : The idea is to first compute values of array by accumulating all increments (We use same technique as this post). After finding elements, we find frequency of every element. Then we compute frequencies of greater elements by traversing from right to left. Finally, we can answer all queries in O(1) time.



My Personal Notes arrow_drop_up

Recommended Posts: