segment_tree.go 708 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package main
  2. // SegmentTree ...
  3. type SegmentTree []int
  4. // NewSegmentTree ...
  5. func NewSegmentTree(a []int) (st SegmentTree) {
  6. n := len(a)
  7. st = make([]int, 2*n)
  8. copy(st[n:], a)
  9. for i := n - 1; 0 < i; i-- {
  10. st[i] = maxInt(st[2*i], st[2*i+1])
  11. }
  12. return
  13. }
  14. // NextGreater ...
  15. func (st SegmentTree) NextGreater(val, i int) int {
  16. n := len(st) / 2
  17. beg, end := i+n, 2*n
  18. if end <= beg {
  19. return -1
  20. }
  21. for ; st[beg] <= val && beg < end; beg, end = beg/2, end/2 {
  22. if beg%2 == 1 {
  23. beg++
  24. }
  25. if end%2 == 1 {
  26. end--
  27. }
  28. }
  29. if st[beg] <= val {
  30. return -1
  31. }
  32. for beg < n {
  33. if val < st[2*beg] {
  34. beg = 2 * beg
  35. } else {
  36. beg = 2*beg + 1
  37. }
  38. }
  39. if beg-n < i {
  40. return -1
  41. }
  42. return beg - n
  43. }