class Solution:
def countStableSubarrays(self, nums: List[int], queries: List[List[int]]) -> List[int]:
n = len(nums)
pos = []
counter = []
count = 1
def f(l):
return l * (l + 1) // 2
for i in range(1, n):
if nums[i - 1] > nums[i]:
pos.append(i - 1)
counter.append(f(count))
count = 1
else:
count += 1
pos.append(n - 1)
counter.append(f(count))
prefixSum = []
sumSofar = 0
for c in counter:
sumSofar += c
prefixSum.append(sumSofar)
def query(l, r):
if r < l:
return 0
if l == 0:
return prefixSum[r]
return prefixSum[r] - prefixSum[l - 1]
ans = []
for left, right in queries:
l = bisect_left(pos, left)
r = bisect_left(pos, right)
if l == r:
ans.append(f(right - left + 1))
continue
# middle full segments
total = query(l + 1, r - 1)
# left partial segment
total += f(pos[l] - left + 1)
# right partial segment
total += f(right - pos[r - 1])
ans.append(total)
return ans
©leetcode