nikunjsoni

715

May 27th, 2021
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. class RangeModule {
  2. public:
  3.     map<int, int> m;
  4.     RangeModule() {
  5.        
  6.     }
  7.    
  8.     void addRange(int left, int right) {
  9.         auto it = m.upper_bound(left);
  10.         if(it != m.begin() && prev(it)->second >= left){
  11.             left = prev(it)->first;
  12.         }
  13.         m[left] = removeIntervals(left, right);
  14.     }
  15.    
  16.     bool queryRange(int left, int right) {
  17.         auto it = m.upper_bound(left);
  18.         if(it != m.begin())
  19.             it--;
  20.         return (left >= it->first && right <= it->second);
  21.     }
  22.    
  23.     void removeRange(int left, int right) {
  24.         int nextRight = removeIntervals(left, right);
  25.         auto it = m.lower_bound(left);
  26.         if(it != m.begin()){
  27.             it--;
  28.             nextRight = max(nextRight, it->second);
  29.             it->second = min(it->second, left);
  30.         }
  31.         if(nextRight > right)
  32.             m[right] = nextRight;
  33.     }
  34.    
  35.     int removeIntervals(int left, int right){
  36.         int r = right;
  37.         for(auto it = m.lower_bound(left); it != m.end() && it->first <= right; ){
  38.             r = max(r, it->second);
  39.             m.erase(it++);
  40.         }
  41.         return r;
  42.     }
  43.    
  44. };
  45.  
  46. /**
  47.  * Your RangeModule object will be instantiated and called as such:
  48.  * RangeModule* obj = new RangeModule();
  49.  * obj->addRange(left,right);
  50.  * bool param_2 = obj->queryRange(left,right);
  51.  * obj->removeRange(left,right);
  52.  */
Advertisement
Add Comment
Please, Sign In to add comment