- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
Physics
Chemistry
Biology
Mathematics
English
Economics
Psychology
Social Studies
Fashion Studies
Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Range Module in C++
Suppose we want a Range Module. This is a module that tracks ranges of numbers. Our task is to design and implement the following interfaces in an efficient manner.
- addRange(left, right). This will the half-open interval [left, right), tracking every real number in that interval. Now, adding an interval that partially overlaps with currently tracked numbers should add any numbers in the interval that are not already tracked.
- queryRange(left, right) . This will return true when every real number in the interval [left, right) is currently being tracked.
- removeRange(left, right), this will stop tracking every real number currently being tracked in the interval [left, right).
To solve this, we will follow these steps −
- Define one map m
- Define a function addRange(), this will take left, right,
- removeRange(left, right)
- m[left] := right
- it := location where left is present in m
- if it is not equal to first element of m and second value of of previous of it is same as left, then −
- (decrease it by 1)
- second of it := right
- delete left from m
- if it is not equal to previous of last element of m and first of next of it is same as right, then −
- second of it := second of next(it)
- delete next(it) from m
- Define a function queryRange(), this will take left, right,
- it := location of a subpart of m all smaller value than left
- if m is empty or it is same as first element of m, then −
- return false
- (decrease it by 1)
- return true when second of it >= right
- Define a function removeRange(), this will take left, right,
- if m is empty, then −
- return
- it := location of a subpart of m all upper value than left
- if it is not equal to first element of m, then −
- (decrease it by 1)
- Define an array v
- while (it is not equal to last element of m and first of it < right), do −
- if first of it < left and second of it > left, then −
- temp := second of it
- second of it := left
- if temp > right, then: m[right] := temp
- otherwise when first of it >= left, then −
- Insert first of it at the end of v
- if second of it > right, then −
- m[right] := second of it
- (increase it by 1)
- if first of it < left and second of it > left, then −
- for initialize i := 0, when i < size of v, update (increase i by 1), do −
- delete v[i] from m
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h> using namespace std; class RangeModule { public: map <int, int> m; RangeModule() { } void addRange(int left, int right) { removeRange(left, right); m[left] = right; map <int, int> :: iterator it = m.find(left); if(it != m.begin() && prev(it)->second == left){ it--; it->second = right; m.erase(left); } if(it != prev(m.end()) && next(it)->first == right){ it->second = next(it)->second; m.erase(next(it)); } } bool queryRange(int left, int right) { map <int, int> :: iterator it = m.upper_bound(left); if(m.empty() || it == m.begin())return false; it--; return it->second >= right; } void removeRange(int left, int right) { if(m.empty())return; map <int, int> :: iterator it = m.lower_bound(left); if(it != m.begin())it--; vector <int> v; while(it != m.end() && it->first < right){ if(it->first < left && it->second > left){ int temp = it->second; it->second = left; if(temp > right){ m[right] = temp; } }else if(it->first >= left){ v.push_back(it->first); if(it->second > right){ m[right] = it->second; } } it++; } for(int i = 0; i < v.size(); i++){ m.erase(v[i]); } } }; main(){ RangeModule ob; ob.addRange(10,20); ob.removeRange(14,16); cout << (ob.queryRange(10,14)) << endl; cout << (ob.queryRange(13,15)) << endl; cout << (ob.queryRange(16,17)); }
Input
Add range (10,20) Remove Range (14,16) Check ranges (10,14), (13,15), (16,17)
Output
1 0 1
Advertisements