<script>
function
gcd(a , b) {
if
(a == 0 || b == 0)
return
0;
if
(a == b)
return
a;
if
(a > b)
return
gcd(a - b, b);
return
gcd(a, b - a);
}
function
getMid(s , e) {
return
s + parseInt((e - s) / 2);
}
function
STconstructUtill(arr , ss , se, st , si , op) {
if
(ss == se) {
st[si] = arr[ss];
return
;
}
var
mid = getMid(ss, se);
if
(op != 0) {
STconstructUtill(arr, ss, mid, st, si * 2 + 1, 0);
}
else
{
STconstructUtill(arr, ss, mid, st, si * 2 + 1, 1);
}
if
(op != 0) {
STconstructUtill(arr, mid + 1, se, st, si * 2 + 2, 0);
}
else
{
STconstructUtill(arr, mid + 1, se, st, si * 2 + 2, 1);
}
if
(op == 1) {
st[si] = gcd(st[2 * si + 1], st[2 * si + 2]);
}
else
{
st[si] = (st[2 * si + 1] * st[2 * si + 2]) /
(gcd(st[2 * si + 1], st[2 * si + 2]));
}
}
function
updateUtil(st , ss , se , ind , val , si , op) {
if
(ind < ss || ind > se)
return
;
if
(ss == se && ss == ind) {
st[si] = val;
return
;
}
var
mid = getMid(ss, se);
if
(op != 0) {
updateUtil(st, ss, mid, ind, val, 2 * si + 1, 0);
}
else
{
updateUtil(st, ss, mid, ind, val, 2 * si + 1, 1);
}
if
(op != 0) {
updateUtil(st, mid + 1, se, ind, val, 2 * si + 2, 0);
}
else
{
updateUtil(st, mid + 1, se, ind, val, 2 * si + 2, 1);
}
if
(op == 1) {
st[si] = gcd(st[2 * si + 1], st[2 * si + 2]);
}
else
{
st[si] = (st[2 * si + 1] * st[2 * si + 2]) /
(gcd(st[2 * si + 1], st[2 * si + 2]));
}
}
function
update(arr, st , n , ind , val) {
if
(ind < 0 || ind > n - 1) {
document.write(
"Invalid Input"
);
return
;
}
var
x = parseInt( (Math.ceil(Math.log(n) / Math.log(2))));
var
opAtRoot = (x % 2 == 0 ? 0 : 1);
arr[ind] = val;
updateUtil(st, 0, n - 1, ind, val, 0, opAtRoot);
}
function
STconstruct(arr , n) {
var
x = parseInt( (Math.ceil(Math.log(n) / Math.log(2))));
var
max_size = 2 * parseInt( Math.pow(2, x) - 1);
var
st = Array(max_size).fill(0);
var
opAtRoot = (x % 2 == 0 ? 0 : 1);
STconstructUtill(arr, 0, n - 1, st, 0, opAtRoot);
return
st;
}
var
arr = [ 5, 4, 8, 10, 6 ];
var
n = arr.length;
var
st = STconstruct(arr, n);
var
rootIndex = 0;
document.write(
"Old Value at Root Node = "
+ st[rootIndex]);
update(arr, st, n, 2, 7);
document.write(
"<br/>New Value at Root Node = "
+ st[rootIndex]);
</script>