| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | type node struct {	l     int	r     int	left  *node	right *node	max   int	tag   int // Lazy}var tree []nodevar tid intfunc (root *node) buildTree(l, r int) {	root.l = l	root.r = r	if l == r {		return	}	tid++	root.left = &tree[tid]	tid++	root.right = &tree[tid]	root.left.buildTree(l, (l+r)/2)	root.right.buildTree((l+r)/2+1, r)}func (root *node) update(i, j, val int) {	if root.l == i && root.r == j {		root.tag = val		return	}	root.max = maxInt(root.max, val)	if m := (root.l + root.r) / 2; j <= m {		root.left.update(i, j, val) // Update left tree	} else if m+1 <= i {		root.right.update(i, j, val) // Right tree	} else {		root.left.update(i, m, val) // Split into 2 parts		root.right.update(m+1, j, val)	}}func (root *node) query(i, j int) int {	if root.l == i && root.r == j {		if root.tag != 0 {			return root.tag		}		return root.max	}	m := (root.l + root.r) / 2	if root.tag != 0 {		root.max = root.tag // PushDown method		root.left.update(root.l, m, root.tag)		root.right.update(m+1, root.r, root.tag)	}	root.tag = 0 // Finished update	if j <= m {		return root.left.query(i, j)	} else if m+1 <= i {		return root.right.query(i, j)	} else {		return maxInt(root.left.query(i, m), root.right.query(m+1, j))	}}func fallingSquares(positions [][]int) []int {	pts := make([]int, 0)	m := make(map[int]int)	for _, pos := range positions {		beg, end := pos[0], pos[0]+pos[1]-1		if _, ok := m[beg]; !ok {			m[beg] = 0			pts = append(pts, beg)		}		if _, ok := m[end]; !ok {			m[end] = 0			pts = append(pts, end)		}	}	sort.Ints(pts)	for i := range pts {		m[pts[i]] = i + 1	} // Discretization	n := len(pts)	tree = make([]node, 2*n)	tid = 0	root := &tree[0]	root.buildTree(1, n)	res := make([]int, len(positions))	for idx, pos := range positions {		i, j := m[pos[0]], m[pos[0]+pos[1]-1]		max := root.query(i, j)		root.update(i, j, max+pos[1])		res[idx] = root.query(1, n)	}	return res}func maxInt(x, y int) int {	if x < y {		return y	}	return x}
 |