Queries for greater than and not less than

• Difficulty Level : Medium
• Last Updated : 26 Mar, 2021

Given an array of N integers. There will be Q queries, each include two integer of form q and x, 0 <= q <= 1. Queries are of two types:

• In first query (q = 0), the task is to find count of integers which are not less than x (OR greater than or equal to x).

• In second query (q = 1), the task is to find count of integers greater than x.

Examples:

Input : arr[] = { 1, 2, 3, 4 } and Q = 3
Query 1: 0 5
Query 2: 1 3
Query 3: 0 3
Output :0
1
2
Explanation:
x = 5, q = 0 : There are no elements greater than or equal to it.
x = 3, q = 1 : There is one element greater than 3 which is 4.
x = 3, q = 0 : There are two elements greater than or equal to 3.

Method 1: A Naive approach can be for each query, traverse the whole array and count integers less or greater than x, depending on q. Time Complexity for this approach will be O(Q*N).
Method 2: An efficient approach can be sort the array and use binary search for each query. This will take O(NlogN + QlogN).
Below is the implementation of this approach :

C++

 // C++ to find number of integer less or greater given// integer queries#includeusing namespace std; // Return the index of integer which are not less than x// (or greater than or equal to x)int lower_bound(int arr[], int start, int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] >= x)            end = mid;        else            start = mid + 1;    }     return start;} // Return the index of integer which are greater than x.int upper_bound(int arr[], int start, int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] <= x)            start = mid + 1;        else            end = mid;    }     return start;} void query(int arr[], int n, int type, int x){    // Counting number of integer which are greater than x.    if (type)        cout << n - upper_bound(arr, 0, n, x) << endl;     // Counting number of integer which are not less than x    // (Or greater than or equal to x)    else        cout << n - lower_bound(arr, 0, n, x) << endl;} // Driven Programint main(){    int arr[] = { 1, 2, 3, 4 };    int n = sizeof(arr)/sizeof(arr);     sort(arr, arr + n);     query(arr, n, 0, 5);    query(arr, n, 1, 3);    query(arr, n, 0, 3);     return 0;}

Java

 // Java to find number of integer// less or greater given// integer queriesimport java.util.Arrays;class GFG{// Return the index of integer// which are not less than x// (or greater than or equal// to x)static int lower_bound(int arr[], int start,                            int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] >= x)            end = mid;        else            start = mid + 1;    }     return start;} // Return the index of integer// which are greater than x.static int upper_bound(int arr[], int start, int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] <= x)            start = mid + 1;        else            end = mid;    }     return start;} static void query(int arr[], int n, int type, int x){    // Counting number of integer    // which are greater than x.    if (type==1)        System.out.println(n - upper_bound(arr, 0, n, x));     // Counting number of integer which    // are not less than x (Or greater    // than or equal to x)    else        System.out.println(n - lower_bound(arr, 0, n, x));} // Driver codepublic static void main (String[] args){    int arr[] = { 1, 2, 3, 4 };    int n = arr.length;     Arrays.sort(arr);     query(arr, n, 0, 5);    query(arr, n, 1, 3);    query(arr, n, 0, 3);}} // This code is contributed by Anant Agarwal.

Python3

 # Python3 program to find number of integer# less or greater given integer queries # Return the index of integer # which are not less than x# (or greater than or equal to x)def lower_bound(arr, start, end, x):     while (start < end):             mid = (start + end) >> 1        if (arr[mid] >= x):            end = mid        else:            start = mid + 1         return start # Return the index of integer# which are greater than x.def upper_bound(arr, start, end, x):     while (start < end):             mid = (start + end) >> 1        if (arr[mid] <= x):            start = mid + 1        else:            end = mid         return start def query(arr, n, type, x):     # Counting number of integer    # which are greater than x.    if (type == 1):        print(n - upper_bound(arr, 0, n, x))     # Counting number of integer    # which are not less than x    # (Or greater than or equal to x)    else:        print(n - lower_bound(arr, 0, n, x)) # Driver codearr = [ 1, 2, 3, 4 ]n =len(arr) arr.sort() query(arr, n, 0, 5)query(arr, n, 1, 3)query(arr, n, 0, 3) # This code is contributed by Anant Agarwal.

C#

 // C# to find number of integer less// or greater given integer queriesusing System; class GFG {     // Return the index of integer which are// not less than x (or greater than or// equal to x)static int lower_bound(int []arr, int start,                             int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] >= x)            end = mid;        else            start = mid + 1;    }     return start;} // Return the index of integer// which are greater than x.static int upper_bound(int []arr, int start,                             int end, int x){    while (start < end)    {        int mid = (start + end)>>1;        if (arr[mid] <= x)            start = mid + 1;        else            end = mid;    }     return start;} static void query(int []arr, int n, int type, int x){    // Counting number of integer    // which are greater than x.    if (type==1)        Console.WriteLine(n - upper_bound(arr, 0, n, x));     // Counting number of integer which    // are not less than x (Or greater    // than or equal to x)    else        Console.WriteLine(n - lower_bound(arr, 0, n, x));} // Driver codepublic static void Main (){    int []arr = {1, 2, 3, 4};    int n = arr.Length;     Array.Sort(arr);     query(arr, n, 0, 5);    query(arr, n, 1, 3);    query(arr, n, 0, 3);}} // This code is contributed by vt_m.

PHP

 > 1;        if (\$arr[\$mid] >= \$x)            \$end = \$mid;        else            \$start = \$mid + 1;    }     return \$start;} // Return the index of integer// which are greater than x.function upper_bound(\$arr, \$start, \$end, \$x){    while (\$start < \$end)    {        \$mid = (\$start + \$end) >> 1;        if (\$arr[\$mid] <= \$x)            \$start = \$mid + 1;        else            \$end = \$mid;    }     return \$start;} function query(\$arr, \$n, \$type, \$x){         // Counting number of integer    // which are greater than x.    if (\$type)        echo \$n - upper_bound(\$arr, 0, \$n, \$x) ,"\n";     // Counting number of integer    // which are not less than x    // (Or greater than or equal to x)    else        echo \$n - lower_bound(\$arr, 0, \$n, \$x) ,"\n";}     // Driver Code    \$arr = array(1, 2, 3, 4);    \$n = count(\$arr);     sort(\$arr);     query(\$arr, \$n, 0, 5);    query(\$arr, \$n, 1, 3);    query(\$arr, \$n, 0, 3); // This code is contributed by anuj_67.?>

Javascript



Output:

0
1
2

Time Complexity : O( (N + Q) * logN).

This article is contributed by Anuj Chauhan. 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.