code: def _range_min(self, p, start, span, i, k):
          
          if start + span <= i or k <= start:        # disjoint intervals
              return self.INF
          if i <= start and start + span <= k:       # included intervals
              return self.s[p]
          left = self._range_min(2 * p, start, span // 2,
                                 i, k)
          right = self._range_min(2 * p + 1, start + span // 2, span // 2,
                                  i, k)
          return min(left, right)
docs: returns the minimum in t in the indexes [i, k) intersected
             with [start, start + span).
             p is the node associated to the later interval.