IntervalContainer
Add and remove intervals from a set of disjoint intervals. Will merge the added interval with any overlapping intervals in the set when adding. Intervals are [inclusive, exclusive).
Time: O(log N) 23 lines stress-tested
content/various/IntervalContainer.h — Simon Lindholm
set<pii>::iterator addInterval(set<pii>& is, int L, int R) {
if (L == R) return is.end();
auto it = is.lower_bound({L, R}), before = it;
while (it != is.end() && it->first <= R) {
R = max(R, it->second);
before = it = is.erase(it);
}
if (it != is.begin() && (--it)->second >= L) {
L = min(L, it->first);
R = max(R, it->second);
is.erase(it);
}
return is.insert(before, {L,R});
}
void removeInterval(set<pii>& is, int L, int R) {
if (L == R) return;
auto it = addInterval(is, L, R);
auto r2 = it->second;
if (it->first == L) is.erase(it);
else (int&)it->second = L;
if (R != r2) is.emplace(R, r2);
}