| 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
 
- }
 
 
  |