2
def __init__(self, start, end):7
self.total = 0 # for range sum query8
self.mx = 0 # for range max query12
def __init__(self, start, end, val):24
node.left = build(l, m)25
node.right = build(m + 1, r)26
node.mx = max(node.left.mx, node.right.mx)27
node.total = node.left.total + node.right.total30
self.root = build(start, end)32
# update the total remain seats and the max remain seats for each node (range) in the segment tree33
def update(self, index, val):35
def updateHelper(node):36
if node.s == node.e == index:40
m = (node.s + node.e) // 242
updateHelper(node.left)44
updateHelper(node.right)45
node.mx = max(node.left.mx, node.right.mx)46
node.total = node.left.total + node.right.total49
updateHelper(self.root)51
def maxQuery(self, k, maxRow, seats):53
def queryHelper(node):55
# check if the row number is less than maxRow and the number of remains seats is greater or equal than k56
if node.e > maxRow or node.total < k:58
if node.e <= maxRow and node.total >= k:59
return [node.e, seats - node.total]60
# we want to greedily search the left subtree to get the smallest row which has enough remain seats62
return queryHelper(node.left)63
return queryHelper(node.right)65
return queryHelper(self.root)67
def sumQuery(self, endRow):69
def queryHelper(node, left, right):70
if left <= node.s and node.e <= right:72
m = (node.s + node.e) // 274
return queryHelper(node.left, left, right)76
return queryHelper(node.right, left, right)77
return queryHelper(node.left, left, m) + queryHelper(78
node.right, m + 1, right81
return queryHelper(self.root, 0, endRow)86
def __init__(self, n: int, m: int):88
self.seg = SegTree(0, n - 1, m)89
# record the remain seats at each row91
# record the index of the smallest row that has remain seats > 094
def gather(self, k: int, maxRow: int) -> List[int]:95
res = self.seg.maxQuery(k, maxRow, self.m)98
self.seg.update(row, k)102
def scatter(self, k: int, maxRow: int) -> bool:103
if self.seg.sumQuery(maxRow) < k:110
total += self.seats[i]112
# use up all the seats at ith row113
self.seg.update(i, self.seats[i])118
# occupy (k - prevTotal) seats at ith row119
self.seg.update(i, k - prevTotal)120
self.seats[i] -= k - prevTotal