this page ⟩ lc notes ⟩ collections ⟩ home

Segment Trees

  • Segment Trees are a data structure where each node is responsible for a range of values.
  • Can do point updates in $O(\log n)$ and range queries in $O(\log n)$.
  • Requires $2\cdot n+1$ storage.
  • Implemented as a collection of complete binary tree.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                               1:                              β”‚     
β”‚                             -----                             β”‚
╔═══════════════════════════════╗────────────────────────────────
β•‘               2:              β•‘               3:              β”‚     
β•‘             [3,11)            β•‘             -----             β”‚
β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•«β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β•”β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•—
β•‘       4:      β”‚       5:      β•‘       6:      β•‘       7:      β•‘
β•‘     [3,7)     β”‚     [7,11)    β•‘     -----     β•‘     [1,3)     β•‘
β•Ÿβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β• β•β•β•β•β•β•β•β•¦β•β•β•β•β•β•β•β•£β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β•’
β•‘   8:  β”‚   9:  β”‚  10:  β”‚  11:  β•‘  12:  β•‘  13:  β•‘  14:  β”‚  15:  β•‘
β•‘ [3,5) β”‚ [5,7) β”‚ [7,9) β”‚ [9,11)β•‘[11,13)β•‘   0   β•‘   1   β”‚   2   β•‘
β•Ÿβ”€β”€β”€β”¬β”€β”€β”€β”Όβ”€β”€β”€β”¬β”€β”€β”€β”Όβ”€β”€β”€β”¬β”€β”€β”€β”Όβ”€β”€β”€β”¬β”€β”€β”€β•«β”€β”€β”€β”¬β”€β”€β”€β• β•β•β•β•€β•β•β•β•©β•β•β•β•€β•β•β•β•ͺ═══╀═══╝
β•‘16:β”‚17:β”‚18:β”‚19:β”‚20:β”‚21:β”‚22:β”‚23:β•‘24:β”‚25:β•‘   β”‚   β”‚   β”‚   β”‚   β”‚   |
β•‘ 3 β”‚ 4 β”‚ 5 β”‚ 6 β”‚ 7 β”‚ 8 β”‚ 9 β”‚10 β•‘11 β”‚12 β•‘   β”‚   β”‚   β”‚   β”‚   β”‚   β”‚
β•šβ•β•β•β•§β•β•β•β•§β•β•β•β•§β•β•β•β•§β•β•β•β•§β•β•β•β•§β•β•β•β•§β•β•β•β•©β•β•β•β•§β•β•β•β•β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”˜
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Tree idx:β”‚
β”‚  range  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

References

OP = lambda a, b: min(a, b)
E = lambda : math.inf

class SegTree:
    def __init__(self, A: List[int]) -> None:
        n = len(A)
        self.T: List[int] = [E()] * (2 * n)
        for i in range(n):
            self.T[n + i] = A[i]

        for i in range(n - 1, 0, -1):
            self.T[i] = OP(self.T[2 * i] , self.T[2 * i + 1])

        self.n: int = n

    def __getitem__(self, i: int) -> int:
        return self.T[self.n + i]
    
    def point_update(self, i: int, value: int) -> None:
        i += self.n
        self.T[i] = value
        while i > 1:
            i //= 2
            self.T[i] = OP(self.T[2 * i] , self.T[2 * i + 1])

    def range_query(self, l: int, r: int) -> int: # [l, r)
        res_l, res_r = E(), E()
        l += self.n
        r += self.n

        while l < r:
            if l % 2 == 1:
                res_l = OP(res_l, self.T[l])
                l += 1
            if r % 2 == 1:
                r -= 1
                res_r = OP(self.T[r], res_r)
            l //= 2
            r //= 2
        return OP(res_l, res_r)



tags: #segment trees #rmq