12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- package main
- // SegmentTree ...
- type SegmentTree []int
- // NewSegmentTree ...
- func NewSegmentTree(a []int) (st SegmentTree) {
- n := len(a)
- st = make([]int, 2*n)
- copy(st[n:], a)
- for i := n - 1; 0 < i; i-- {
- st[i] = maxInt(st[2*i], st[2*i+1])
- }
- return
- }
- // NextGreater ...
- func (st SegmentTree) NextGreater(val, i int) int {
- n := len(st) / 2
- beg, end := i+n, 2*n
- if end <= beg {
- return -1
- }
- for ; st[beg] <= val && beg < end; beg, end = beg/2, end/2 {
- if beg%2 == 1 {
- beg++
- }
- if end%2 == 1 {
- end--
- }
- }
- if st[beg] <= val {
- return -1
- }
- for beg < n {
- if val < st[2*beg] {
- beg = 2 * beg
- } else {
- beg = 2*beg + 1
- }
- }
- if beg-n < i {
- return -1
- }
- return beg - n
- }
|