<script>
let mod = 1000000000;
function
getMid(s,e)
{
return
s + Math.floor((e - s) / 2);
}
function
getPdtUtil(st,ss,se,qs,qe,si)
{
if
(qs <= ss && qe >= se)
return
st[si];
if
(se < qs || ss > qe)
return
1;
let mid = getMid(ss, se);
return
(getPdtUtil(st, ss, mid, qs,
qe, 2 * si + 1) % mod *
getPdtUtil(st, mid + 1, se, qs,
qe, 2 * si + 2) % mod) % mod;
}
function
updateValueUtil(st,ss,se,i,prev_val,new_val,si)
{
if
(i < ss || i > se)
return
;
st[si] = Math.floor((st[si] * new_val) / prev_val);
if
(se != ss)
{
let mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i, prev_val,
new_val, 2 * si + 1);
updateValueUtil(st, mid + 1, se, i, prev_val,
new_val, 2 * si + 2);
}
}
function
updateValue(arr,st,n,i,new_val)
{
if
(i < 0 || i > n - 1)
{
document.write(
"Invalid Input<br>"
);
return
;
}
let temp = arr[i];
arr[i] = new_val;
updateValueUtil(st, 0, n - 1, i,
temp, new_val, 0);
}
function
getPdt(st,n,qs,qe)
{
if
(qs < 0 || qe > n - 1 || qs > qe)
{
document.write(
"Invalid Input<br>"
);
return
-1;
}
return
getPdtUtil(st, 0, n - 1, qs, qe, 0);
}
function
constructSTUtil(arr,ss,se,st,si)
{
if
(ss == se)
{
st[si] = arr[ss];
return
arr[ss];
}
let mid = getMid(ss, se);
st[si] = (constructSTUtil(arr, ss, mid, st,
si * 2 + 1) % mod *
constructSTUtil(arr, mid + 1, se, st,
si * 2 + 2) % mod) % mod;
return
st[si];
}
function
constructST(arr,n)
{
let x = (Math.ceil(Math.log(n) /
Math.log(2)));
let max_size = 2 * Math.pow(2, x) - 1;
let st =
new
Array(max_size);
constructSTUtil(arr, 0, n - 1, st, 0);
return
st;
}
let arr=[1, 2, 3, 4, 5, 6 ];
let n = arr.length;
let st = constructST(arr, n);
document.write(
"Product of values in "
+
"given range = "
,
getPdt(st, n, 1, 3)+
"<br>"
);
updateValue(arr, st, n, 1, 10);
document.write(
"Updated Product of values "
+
"in given range = "
,
getPdt(st, n, 1, 3)+
"<br>"
);
</script>