void removeRange(int left, int right) { auto rng = rc.equal_range(make_pair(left, right)); int sv = right, ev = left; if (rng.first != rc.end()) { sv = rng.first->first; if (rng.second != rc.begin()) { auto pre = prev(rng.second); ev = max(ev, pre->second); } } rc.erase(rng.first, rng.second); if (sv < left) { rc.insert(make_pair(sv, left)); } if (right < ev) { rc.insert(make_pair(right, ev)); } }
void addRange(int left, int right) { auto rng = rc.equal_range(make_pair(left, right)); int nleft = left; if (rng.first != rc.end()) { nleft = min(nleft, rng.first->first); } if (rng.first != rc.begin()) { auto pre = prev(rng.first); if (pre != rc.end() && pre->second == left) { nleft = pre->first; rng.first = pre; } } if (rng.second != rc.end() && rng.second->first == right) { right = rng.second->second; ++rng.second; } else if (rng.second != rc.begin()) { auto pre = prev(rng.second); if (pre != rc.end()) { right = max(right, pre->second); } } rc.erase(rng.first, rng.second); rc.insert(make_pair(nleft, right)); }