<script>
var
seg;
function
maxLength(a , b , n , c) {
if
(n == 0)
return
0;
var
max_length = 0;
var
low = 0, high = n;
while
(low <= high) {
var
mid = low + parseInt((high - low) / 2);
if
(possible(a, b, n, c, mid)) {
max_length = mid;
low = mid + 1;
}
else
high = mid - 1;
}
return
max_length;
}
function
possible(a , b , n , c , k) {
var
sum = 0;
for
(i = 0; i < k; i++) {
sum += a[i];
}
var
total_cost = sum * k + getMax(b, 0, n - 1, 0, k - 1, 0);
if
(total_cost <= c)
return
true
;
for
(i = k; i < n; i++) {
sum += a[i];
sum -= a[i - k];
total_cost = sum * k + getMax(b, 0, n - 1, i - k + 1, i, 0);
if
(total_cost <= c)
return
true
;
}
return
false
;
}
function
build(b , index , s , e) {
if
(s == e) {
seg[index] = b[s];
return
;
}
var
mid = s + parseInt((e - s) / 2);
build(b, 2 * index + 1, s, mid);
build(b, 2 * index + 2, mid + 1, e);
seg[index] = Math.max(seg[2 * index + 1], seg[2 * index + 2]);
}
function
getMax(b , ss , se , qs , qe , index) {
if
(se < qs || ss > qe)
return
parseInt(Number.MIN_VALUE / 2);
if
(ss >= qs && se <= qe)
return
seg[index];
var
mid = ss + (se - ss) / 2;
return
Math.max(getMax(b, ss, mid, qs, qe, 2 * index + 1), getMax(b, mid + 1, se, qs, qe, 2 * index + 2));
}
function
initialiseSegmentTree(N) {
seg = Array(4 * N).fill(0);
}
var
A = [ 1, 2, 1, 6, 5, 5, 6, 1 ];
var
B = [ 14, 8, 15, 15, 9, 10, 7, 12 ];
var
C = 40;
var
N = A.length;
initialiseSegmentTree(N);
build(B, 0, 0, N - 1);
document.write(maxLength(A, B, N, C));
</script>