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: 7
Output:
Yes
Yes
No
No
1st 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.
Below is the implementation of above approach:
C++
// C++ program to check if the // number lies in given range #include <bits/stdc++.h> using namespace std; // Function that answers every query void 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 code int 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
// Java program to check if the // number lies in given range import 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 |
Python3
# Python program to check if the # number lies in given range from bisect import bisect_left as lower_bound # Function that answers every query def 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 Code if __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#
// C# program to check if the // number lies in given range using 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 |
Javascript
<script> // Javascript program to check if the // number lies in given range // Function that answers every query function 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 implementation function 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 Code let a=[[ 5, 6 ], [ 1, 3 ], [ 8, 10 ]]; let n = 3; let queries=[2, 3, 4, 7]; let q = queries.length; // function call to answer queries answerQueries(a, n, queries, q); // This code is contributed by rag2127 </script> |
Yes Yes No No
Time Complexity: O(n*log(n)+q*log(n))
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!