Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def rangeSum(self, nums, n, left, right):7 """8 :type nums: List[int]9 :type n: int10 :type left: int11 :type right: int12 :rtype: int13 """14 def countUntil(nums, target):15 result, curr, left = 0, 0, 016 for right in xrange(len(nums)):17 curr += nums[right]18 while curr > target:19 curr -= nums[left]20 left += 121 result += right-left+122 return result23 24 def sumUntil(nums, prefix, target):25 result, curr, total, left = 0, 0, 0, 026 for right in xrange(len(nums)):27 curr += nums[right]28 total += nums[right]*(right-left+1)29 while curr > target:30 curr -= nums[left]31 total -= prefix[right+1]-prefix[(left-1)+1]32 left += 133 result += total34 return result35 36 def sumLessOrEqualTo(prefix, nums, left, right, count):37 while left <= right:38 mid = left + (right-left)239 if countUntil(nums, mid)-count >= 0:40 right = mid-141 else:42 left = mid+143 return sumUntil(nums, prefix, left)-left*(countUntil(nums, left)-count)44 45 MOD = 10**9+746 prefix = [0]*(len(nums)+1)47 for i in xrange(len(nums)):48 prefix[i+1] = prefix[i]+nums[i]49 m, M = min(nums), sum(nums)50 return (sumLessOrEqualTo(prefix, nums, m, M, right) -51 sumLessOrEqualTo(prefix, nums, m, M, left-1))%MOD52 53 54 555657import heapq58 59 6061class Solution2(object):62 def rangeSum(self, nums, n, left, right):63 """64 :type nums: List[int]65 :type n: int66 :type left: int67 :type right: int68 :rtype: int69 """70 MOD = 10**9+771 min_heap = []72 for i, num in enumerate(nums, 1):73 heapq.heappush(min_heap, (num, i))74 result = 075 for i in xrange(1, right+1):76 total, j = heapq.heappop(min_heap)77 if i >= left:78 result = (result+total)%MOD79 if j+1 <= n:80 heapq.heappush(min_heap, (total+nums[j], j+1))81 return result82