<script>
function
InsertionIndex(nums, target, left)
{
let low = 0,
high = nums.length
while
(low < high) {
const mid = low + Math.floor((high - low) / 2)
if
(nums[mid] > target || (left && target === nums[mid]))
high = mid
else
low = mid + 1
}
return
low
}
function
upper_bound(nums, target) {
const targetRange = [-1, -1]
const leftIdx = InsertionIndex(nums, target,
true
)
if
(leftIdx === nums.length || nums[leftIdx] != target)
return
targetRange
targetRange[0] = leftIdx
targetRange[1] = InsertionIndex(nums, target,
false
) - 1
return
targetRange
}
function
maxSubsetSum(arr, L, R) {
let N = arr.length;
arr.sort(
function
(a, b) {
return
a - b })
let sum =
new
Array(N + 1).fill(0);
let ans = 0;
for
(let i = 1; i <= N; i++) {
sum[i] = sum[i - 1] + arr[i - 1];
}
for
(let i = 0; i < N; i++) {
let val = arr[i] + R;
let ptr = upper_bound(
arr, val);
let j = ptr[1]
if
((arr[j] - arr[i] <= R)
&& (arr[j] - arr[i] >= L)) {
ans = Math.max(ans, sum[j + 1] - sum[i]);
}
}
return
ans;
}
let arr = [6, 5, 0, 9, 1];
let L = 0;
let R = 3;
document.write(maxSubsetSum(arr, L, R));
</script>