Queries for counts of array elements with values in given range

Given an unsorted array of size n, find no of elements between two elements i and j (both inclusive).

Examples:

```Input :  arr = [1 3 3 9 10 4]
i1 = 1, j1 = 4
i2 = 9, j2 = 12
Output : 4
2
The numbers are: 1 3 3 4 for first query
The numbers are: 9 12 for second query
```

Source: Amazon Interview Experience

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A simple approach will be to run a for loop to check if each element is in the given range and maintain their count. Time complexity for running each query will be O(n).

C++

```// Simple C++ program to count number of elements
// with values in given range.
#include <iostream>
using namespace std;

// function to count elements within given range
int countInRange(int arr[], int n, int x, int y)
{
// initialize result
int count = 0;
for (int i = 0; i < n; i++) {

// check if element is in range
if (arr[i] >= x && arr[i] <= y)
count++;
}
return count;
}

// driver function
int main()
{
int arr[] = { 1, 3, 4, 9, 10, 3 };
int n = sizeof(arr) / sizeof(arr[0]);

int i = 1, j = 4;
cout << countInRange(arr, n, i, j) << endl;

i = 9, j = 12;
cout << countInRange(arr, n, i, j) << endl;
return 0;
}
```

Python

```# function to count elements within given range
def countInRange(arr, n, x, y):

# initialize result
count = 0;

for i in range(n):

# check if element is in range
if (arr[i] >= x and arr[i] <= y):
count += 1
return count

# driver function
arr = [1, 3, 4, 9, 10, 3]
n = len(arr)

i = 1
j = 4
print(countInRange(arr, n, i, j))
i = 9
j = 12
print(countInRange(arr, n, i, j))

```

Output:

```4
2
```

An Efficient Approach will be to first sort the array and then using a modified binary search function find two indices, one of first element greater than or equal to lower bound of range and the other of the last element less than or equal to upperbound. Time for running each query will be O(logn) and for sorting the array once will be O(nlogn).

C++

```// Efficient C++ program to count number of elements
// with values in given range.
#include <bits/stdc++.h>
using namespace std;

// function to find first index >= x
int lowerIndex(int arr[], int n, int x)
{
int l = 0, h = n - 1;
while (l <= h) {
int mid = (l + h) / 2;
if (arr[mid] >= x)
h = mid - 1;
else
l = mid + 1;
}
return l;
}

// function to find last index <= y
int upperIndex(int arr[], int n, int y)
{
int l = 0, h = n - 1;
while (l <= h) {
int mid = (l + h) / 2;
if (arr[mid] <= y)
l = mid + 1;
else
h = mid - 1;
}
return h;
}

// function to count elements within given range
int countInRange(int arr[], int n, int x, int y)
{
// initialize result
int count = 0;
count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;
return count;
}

// driver function
int main()
{
int arr[] = { 1, 4, 4, 9, 10, 3 };
int n = sizeof(arr) / sizeof(arr[0]);

// Preprocess array
sort(arr, arr + n);

int i = 1, j = 4;
cout << countInRange(arr, n, i, j) << endl;

i = 9, j = 12;
cout << countInRange(arr, n, i, j) << endl;
return 0;
}
```

Python

```# function to find first index >= x
def lowerIndex(arr, n, x):
l = 0
h = n-1
while (l <= h):
mid = int((l + h)/2)
if (arr[mid] >= x):
h = mid - 1
else:
l = mid + 1
return l

# function to find last index <= x
def upperIndex(arr, n, x):
l = 0
h = n-1
while (l <= h):
mid = int((l + h)/2)
if (arr[mid] <= x):
l = mid + 1
else:
h = mid - 1
return h

# function to count elements within given range
def countInRange(arr, n, x, y):
# initialize result
count = 0;
count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;
return count

# driver function
arr = [1, 3, 4, 9, 10, 3]

# Preprocess array
arr.sort()
n = len(arr)

i = 1
j = 4
print(countInRange(arr, n, i, j))
i = 9
j = 12
print(countInRange(arr, n, i, j))

```

Output:

```4
2
```

This article is contributed by Aditi Sharma. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
2.5 Average Difficulty : 2.5/5.0
Based on 12 vote(s)

Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.