Queries to check if a number lies in N ranges of L-R - GeeksforGeeks

22 Jul, 2021
Given N ranges and Q queries consisting of numbers. Every range consists of L and R. The task is to check if the given number lies in any of the given ranges or not for every query.Note: There is no overlapping range.Examples:  
Input: range[] = { {5, 6}, {1, 3}, {8, 10} Q = 4 1st query: 2 2nd query: 3 3rd query: 4 4th query: 7Output: Yes Yes No No1st query: 2 lies in a range 1-3 2nd query: 3 lies in a range 1-3 3rd query: 4 does not lie in any of the given range. 4th query: 7 does not lie in any of the given range.  
 
Approach: Below is the step by step algorithm to solve this problem:  
Hash the L of every range as 1, and hash the R of every range as 2.Push the L and R separately into a container.Sort the elements in the container, all the range L and R will be adjacent to each other as do not overlap.For every query, use binary search to find the first occurrence of a number same or greater than it. This can be done using the lower_bound function.If there is any value which is equal to the query, then the number overlaps the range.If there is no value which is equal to the query, then check if the greater element is hashed as 1 or 2.If it is hashed as 1, then the number does not overlaps, else it does overlap.
Hash the L of every range as 1, and hash the R of every range as 2.
Push the L and R separately into a container.
Sort the elements in the container, all the range L and R will be adjacent to each other as do not overlap.
For every query, use binary search to find the first occurrence of a number same or greater than it. This can be done using the lower_bound function.
If there is any value which is equal to the query, then the number overlaps the range.
If there is no value which is equal to the query, then check if the greater element is hashed as 1 or 2.
If it is hashed as 1, then the number does not overlaps, else it does overlap.
Below is the implementation of above approach: 
C++
Java
Python3
C#
Javascript
// C++ program to check if the// number lies in given range#include <bits/stdc++.h> using namespace std; // Function that answers every queryvoid answerQueries(int a[][2], int n, int queries[], int q){     // container to store all range    vector<int> v;     // hash the L and R    unordered_map<int, int> mpp;     // Push the element to container    // and hash the L and R    for (int i = 0; i < n; i++) {         v.push_back(a[i][0]);        mpp[a[i][0]] = 1;        v.push_back(a[i][1]);        mpp[a[i][1]] = 2;    }     // sort the elements in container    sort(v.begin(), v.end());    for (int i = 0; i < q; i++) {         // each query        int num = queries[i];         // get the number same or greater than integer        int ind = lower_bound(v.begin(), v.end(), num) - v.begin();         // if it lies        if (v[ind] == num) {            cout << "Yes\n";        }         else {             // check if greater is hashed as 2            if (mpp[v[ind]] == 2)                cout << "Yes\n";             else // check if greater is hashed as 1                cout << "No\n";        }    }} // Driver codeint main(){    int a[][2] = { { 5, 6 }, { 1, 3 }, { 8, 10 } };     int n = 3;     int queries[] = { 2, 3, 4, 7 };     int q = sizeof(queries) / sizeof(queries[0]);     // function call to answer queries    answerQueries(a, n, queries, q);     return 0;}
// Java program to check if the// number lies in given rangeimport java.io.*;import java.util.*; class GFG{     // Function that answers every query    static void answerQueries(int[][] a, int n,                               int[] queries, int q)    {         // container to store all range        Vector<Integer> v = new Vector<>();         // hash the L and R        HashMap<Integer, Integer> mpp = new HashMap<>();         // Push the element to container        // and hash the L and R        for (int i = 0; i < n; i++)        {            v.add(a[i][0]);            mpp.put(a[i][0], 1);            v.add(a[i][1]);            mpp.put(a[i][1], 2);        }         // sort the elements in container        Collections.sort(v);        for (int i = 0; i < q; i++)        {             // each query            int num = queries[i];             // get the number same or greater than integer            int ind = lowerBound(v, num);             // if it lies            if (ind >= 0 && v.elementAt(ind) == num)                System.out.println("Yes");             else            {                 // check if greater is hashed as 2                if (ind >= 0 && mpp.get(v.elementAt(ind)) == 2)                    System.out.println("Yes");                 else // check if greater is hashed as 1                    System.out.println("No");            }        }    }     // Lower bound implementation    static int lowerBound(Vector<Integer> array, int value)    {        int low = 0;        int high = array.size();        while (low < high)        {            final int mid = (low + high) / 2;            if (value <= array.elementAt(mid))            {                high = mid;            }            else            {                low = mid + 1;            }        }        return low;    }     // Driver Code    public static void main(String[] args)    {         int[][] a = {{ 5, 6 }, { 1, 3 }, { 8, 10 }};        int n = 3;        int[] queries = {2, 3, 4, 7};        int q = queries.length;         // function call to answer queries        answerQueries(a, n, queries, q);    }} // This code is contributed by// sanjeev2552
# Python program to check if the# number lies in given rangefrom bisect import bisect_left as lower_bound # Function that answers every querydef answerQueries(a: list, n, queries: list, q):     # container to store all range    v = list()     # hash the L and R    mpp = dict()     # Push the element to container    # and hash the L and R    for i in range(n):        v.append(a[i][0])        mpp[a[i][0]] = 1        v.append(a[i][1])        mpp[a[i][1]] = 2     # sort the elements in container    v.sort()    for i in range(q):         # each query        num = queries[i]         # get the number same or greater than integer        ind = lower_bound(v, num)         # if it lies        if v[ind] == num:            print("Yes")        else:             # check if greater is hashed as 2            if mpp[v[ind]] == 2:                print("Yes")             # check if greater is hashed as 1            else:                print("No") # Driver Codeif __name__ == "__main__":    a = [[5, 6], [1, 3], [8, 10]]    n = 3    queries = [2, 3, 4, 7]    q = len(queries)     # function call to answer queries    answerQueries(a, n, queries, q) # This code is contributed by# sanjeev2552
// C# program to check if the// number lies in given rangeusing System;using System.Collections.Generic; class GFG{     // Function that answers every query    static void answerQueries(int[,] a, int n,                            int[] queries, int q)    {         // container to store all range        List<int> v = new List<int>();         // hash the L and R        Dictionary<int, int> mpp = new Dictionary<int, int>();         // Push the element to container        // and hash the L and R        for (int i = 0; i < n; i++)        {            v.Add(a[i, 0]);            if(!mpp.ContainsKey(a[i, 0]))                mpp.Add(a[i, 0], 1);            v.Add(a[i, 1]);            if(!mpp.ContainsKey(a[i, 1]))                mpp.Add(a[i, 1], 2);        }         // sort the elements in container        v.Sort();        for (int i = 0; i < q; i++)        {             // each query            int num = queries[i];             // get the number same or greater than integer            int ind = lowerBound(v, num);             // if it lies            if (ind >= 0 && v[ind] == num)                Console.WriteLine("Yes");             else            {                 // check if greater is hashed as 2                if (ind >= 0 && mpp[v[ind]] == 2)                    Console.WriteLine("Yes");                 else // check if greater is hashed as 1                    Console.WriteLine("No");            }        }    }     // Lower bound implementation    static int lowerBound(List<int> array, int value)    {        int low = 0;        int high = array.Count;        while (low < high)        {            int mid = (low + high) / 2;            if (value <= array[mid])            {                high = mid;            }            else            {                low = mid + 1;            }        }        return low;    }     // Driver Code    public static void Main(String[] args)    {         int[,] a = {{ 5, 6 }, { 1, 3 }, { 8, 10 }};        int n = 3;        int[] queries = {2, 3, 4, 7};        int q = queries.Length;         // function call to answer queries        answerQueries(a, n, queries, q);    }} // This code is contributed by 29AjayKumar
<script>// Javascript program to check if the// number lies in given range // Function that answers every queryfunction answerQueries(a, n, queries, q){     // container to store all range        let v = [];          // hash the L and R        let mpp = new Map();          // Push the element to container        // and hash the L and R        for (let i = 0; i < n; i++)        {            v.push(a[i][0]);            mpp.set(a[i][0], 1);            v.push(a[i][1]);            mpp.set(a[i][1], 2);        }          // sort the elements in container        v.sort(function(a,b){return a-b;});        for (let i = 0; i < q; i++)        {              // each query            let num = queries[i];              // get the number same or greater than integer            let ind = lowerBound(v, num);              // if it lies            if (ind >= 0 && v[ind] == num)                document.write("Yes<br>");              else            {                  // check if greater is hashed as 2                if (ind >= 0 && mpp.get(v[ind]) == 2)                    document.write("Yes<br>");                  else // check if greater is hashed as 1                    document.write("No<br>");            }        }} // Lower bound implementationfunction lowerBound(array,value){    let low = 0;        let high = array.length;        while (low < high)        {            let mid = Math.floor((low + high) / 2);            if (value <= array[mid])            {                high = mid;            }            else            {                low = mid + 1;            }        }        return low;} // Driver Codelet a=[[ 5, 6 ], [ 1, 3 ], [ 8, 10 ]];let n = 3;let queries=[2, 3, 4, 7];let q = queries.length; // function call to answer queriesanswerQueries(a, n, queries, q); // This code is contributed by rag2127</script>
Yes
Yes
No
No
 
sanjeev2552
29AjayKumar
arorakashish0911
rag2127
array-range-queries
Binary Search
cpp-unordered_map
Searching
Sorting
Searching
Sorting
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Best First Search (Informed Search)
3 Different ways to print Fibonacci series in Java
Find whether an array is subset of another array | Added Method 5
Program to remove vowels from a String
Recursive Programs to find Minimum and Maximum elements of array