44 lines
610 B
Go
44 lines
610 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"cmp"
|
||
|
|
||
|
pq "github.com/emirpasic/gods/v2/queues/priorityqueue"
|
||
|
)
|
||
|
|
||
|
const MOD int = 1_000_000_007
|
||
|
|
||
|
type Sum struct {
|
||
|
index int
|
||
|
sum int
|
||
|
}
|
||
|
|
||
|
func cmpSum(a, b Sum) int {
|
||
|
return cmp.Compare(a.sum, b.sum)
|
||
|
}
|
||
|
|
||
|
func rangeSum(nums []int, n int, left int, right int) int {
|
||
|
q := pq.NewWith[Sum](cmpSum)
|
||
|
|
||
|
for i, num := range nums {
|
||
|
q.Enqueue(Sum{index: i, sum: num})
|
||
|
}
|
||
|
|
||
|
total := 0
|
||
|
for i := 1; i <= right; i++ {
|
||
|
s, _ := q.Dequeue()
|
||
|
|
||
|
if i >= left {
|
||
|
total = (total + s.sum) % MOD
|
||
|
}
|
||
|
|
||
|
if s.index < n-1 {
|
||
|
s.index++
|
||
|
s.sum += nums[s.index]
|
||
|
q.Enqueue(s)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return total
|
||
|
}
|