<script>
function
build(tree,A, start,end, node)
{
if
(start == end) {
tree[node] = A[start];
return
tree[node];
}
let mid = Math.floor((start + end) / 2);
let X = build(tree, A, start, mid,
2 * node + 1);
let Y = build(tree, A, mid + 1,
end, 2 * node + 2);
return
tree[node] = Math.min(X, Y);
}
function
query(tree,start, end,l, r, node)
{
if
(start > r || end < l)
return
Number.MAX_VALUE;
if
(start >= l && end <= r)
return
tree[node];
let mid = Math.floor((start + end) / 2);
let X = query(tree, start, mid, l,
r, 2 * node + 1);
let Y = query(tree, mid + 1, end, l,
r, 2 * node + 2);
return
Math.min(X, Y);
}
function
longestSubArray(A,N,K)
{
let res = 1;
let preSum =
new
Array(N + 1);
preSum[0] = A[0];
for
(let i = 0; i < N; i++)
preSum[i + 1] = preSum[i] + A[i];
let tree =
new
Array(4 * N + 5);
build(tree, A, 0, N - 1, 0);
for
(let i = 0; i < N; i++) {
let start = i;
let end = N - 1;
let mid;
let max_index = i;
while
(start <= end) {
mid = Math.floor((start + end) / 2);
let min_element
= query(tree, 0, N - 1, i, mid, 0);
let expected_sum
= (mid - i + 1) * min_element;
let actual_sum
= preSum[mid + 1] - preSum[i];
if
(actual_sum - expected_sum <= K) {
start = mid + 1;
max_index = Math.max(max_index, mid);
}
else
{
end = mid - 1;
}
}
res = Math.max(res, max_index - i + 1);
}
return
res;
}
let arr = [ 1, 7, 3, 4, 5, 6 ];
let k = 6;
let n = 6;
document.write(longestSubArray(arr, n, k),
"</br>"
);
</script>