class Node:
def __init__(self, l, r):
self.l = l
self.r = r
self.mid = (l + r) >> 1
self.v = 0
self.lazy = 0
self.left = None
self.right = None
class SegmentTree:
def __init__(self, arr):
self.arr = arr
self.root = self._build(0, len(arr) - 1)
def _build(self, l, r):
node = Node(l, r)
if l == r:
node.v = self.arr[l]
return node
node.left = self._build(l, node.mid)
node.right = self._build(node.mid + 1, r)
node.v = max(node.left.v, node.right.v)
return node
def _push(self, node):
if node.lazy:
node.left.lazy += node.lazy
node.left.v = max(0, node.left.v - node.lazy)
node.right.lazy += node.lazy
node.right.v = max(0, node.right.v - node.lazy)
node.lazy = 0
def update(self, l, r, val, node=None):
if not node:
node = self.root
if r < node.l or l > node.r:
return
if l <= node.l and node.r <= r:
node.v = max(0, node.v - val)
node.lazy += val
return
self._push(node)
self.update(l, r, val, node.left)
self.update(l, r, val, node.right)
node.v = max(node.left.v, node.right.v)
def query(self, l, r, node=None):
if not node:
node = self.root
if r < node.l or l > node.r:
return 0
if l <= node.l and node.r <= r:
return node.v
self._push(node)
return max(self.query(l, r, node.left), self.query(l, r, node.right))
class Solution:
def minZeroArray(self, nums: List[int], queries: List[List[int]]) -> int:
n = len(nums)
if sum(nums) == 0:
return 0
tree = SegmentTree(nums)
for index, [l, r, val] in enumerate(queries):
tree.update(l, r, val)
total = tree.query(0, n - 1)
if total <= 0:
return index + 1
return -1