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 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
// 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 |
Python3
# 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#
// 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 |
Javascript
<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
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!
