2
def __init__(self, low, high):11
def _build(self, left, right):12
root = SegmentTreeNode(self.coords[left], self.coords[right])16
mid = (left + right) // 217
root.left = self._build(left, mid)18
root.right = self._build(mid + 1, right)21
def _update(self, root, lower, upper, val):24
if lower <= root.high and root.low <= upper: # intersect26
self._update(root.left, lower, upper, val)27
self._update(root.right, lower, upper, val)29
def _query(self, root, lower, upper):30
if lower <= root.low and root.high <= upper:32
if upper < root.low or root.high < lower:35
self._query(root.left, lower, upper), self._query(root.right, lower, upper)38
def fallingSquares(self, positions: List[List[int]]) -> List[int]:39
# coordinates compression41
for left, size in positions:42
right = left + size - 145
self.coords = sorted(list(coords))46
root = self._build(0, len(self.coords) - 1)49
for left, size in positions:50
right = left + size - 151
h = self._query(root, left, right) + size52
res.append(max(res[-1], h)) if res else res.append(h)53
self._update(root, left, right, h)