c++
class Solution {
public:
int countPart(vector<long long>& sum, int l1, int r1, int l2, int r2, int lower, int upper) {
int ans = 0, l = l1, r = l1;
for (int j = l2; j <= r2; j++) {
long long a = sum[j] - upper;
long long b = sum[j] - lower;
while (l <= r1 && sum[l] < a) l++;
while (r <= r1 && sum[r] <= b) r++;
ans += r - l;
}
return ans;
}
int mergeSort(vector<long long>& sum, int l, int r, int lower, int upper) {
if (l >= r) return 0;
int mid = (l + r) >> 1, ans = 0;
ans += mergeSort(sum, l, mid, lower, upper);
ans += mergeSort(sum, mid + 1, r, lower, upper);
ans += countPart(sum, l, mid, mid + 1, r, lower, upper);
int k = l, p1 = l, p2 = mid + 1;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && sum[p1] <= sum[p2])) temp[k++] = sum[p1++];
else temp[k++] = sum[p2++];
}
for (int i = l; i <= r; i++) sum[i] = temp[i];
return ans;
}
vector<long long> temp;
int countRangeSum(vector<int>& nums, int lower, int upper) {
vector<long long> sum(nums.size() + 1, 0);
for (int i = 0; i < nums.size(); i++) sum[i + 1] = sum[i] + nums[i];
while (temp.size() < sum.size()) temp.push_back(0);
return mergeSort(sum, 0, sum.size() -1, lower, upper);
}
};
js
var countPart = function(sum, a1, b1, a2, b2, lower, upper) {
var ans = 0, l = a1, r = a1;
for (var j = a2; j <= b2; j++) {
var a = sum[j] - upper, b = sum[j] - lower;
while (l <= b1 && sum[l] < a) l++;
while (r <= b1 && sum[r] <= b) r++;
ans += r - l;
}
return ans;
}
var mergeSort = function(sum, temp, l, r, lower, upper) {
if (l >= r) return 0;
var ans = 0, mid = (l + r) >> 1;
ans += mergeSort(sum, temp, l, mid, lower, upper);
ans += mergeSort(sum, temp, mid + 1, r, lower, upper);
ans += countPart(sum, l, mid, mid + 1, r, lower, upper);
var k = l, p1 = l, p2 = mid + 1;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && sum[p1] <= sum[p2])) temp[k++] = sum[p1++];
else temp[k++] = sum[p2++];
}
for (var i = l; i <= r; i++) sum[i] = temp[i];
return ans;
}
var countRangeSum = function(nums, lower, upper) {
var sum = new Array(nums.length + 1).fill(0), temp = new Array(nums.length + 1).fill(0);
for (var i = 0; i < nums.length; i++) sum[i + 1] = sum[i] + nums[i];
return mergeSort(sum, temp, 0, nums.length, lower, upper);
};