4
# initialize the merged intervals list as below to handle edge cases5
self.interv = [(-inf, -inf), (inf, inf)]8
def add(self, left: int, right: int) -> None:12
# find the left most position for inserting of the new potentially merged interval13
# we use `left - 1` because the interval coverage is inclusive14
li = bisect.bisect_left(interv, left - 1, key=itemgetter(1))15
lval = min(interv[li][0], left)17
# find the right most position for inserting the new potentially merged interval18
# we use `right + 1` because the interval coverage is inclusive19
ri = bisect.bisect_right(interv, right + 1, key=itemgetter(0))20
rval = max(interv[ri - 1][1], right)22
# find the coverage of the intervals that will be replaced by the new interval24
for _ in range(li, ri):25
to_delete += interv[_][1] - interv[_][0] + 128
self.cov += rval - lval + 1 - to_delete29
interv[li:ri] = [(lval, rval)]31
def count(self) -> int: