<script>
function
getMid(s, e)
{
return
s + parseInt((e - s) / 2, 10);
}
function
getXorUtil(st, ss, se, qs, qe, si)
{
if
(qs <= ss && qe >= se)
return
st[si];
if
(se < qs || ss > qe)
return
0;
let mid = getMid(ss, se);
return
getXorUtil(st, ss, mid, qs,
qe, 2 * si + 1) ^
getXorUtil(st, mid + 1, se, qs,
qe, 2 * si + 2);
}
function
updateValueUtil(st, ss, se, i, diff, si)
{
if
(i < ss || i > se)
return
;
st[si] = st[si] + diff;
if
(se != ss)
{
let mid = getMid(ss, se);
updateValueUtil(st, ss, mid, i, diff,
2 * si + 1);
updateValueUtil(st, mid + 1, se, i, diff,
2 * si + 2);
}
}
function
updateValue(arr, st, n, i, new_val)
{
if
(i < 0 || i > n - 1)
{
document.write(
"Invalid Input"
);
return
;
}
let diff = new_val - arr[i];
arr[i] = new_val;
updateValueUtil(st, 0, n - 1, i, diff, 0);
}
function
getXor(st, n, qs, qe)
{
if
(qs < 0 || qe > n - 1 || qs > qe)
{
document.write(
"Invalid Input"
);
return
-1;
}
return
getXorUtil(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) ^
constructSTUtil(arr, mid + 1, se, st,
si * 2 + 2);
return
st[si];
}
function
constructST(arr, n)
{
let x = (Math.ceil(Math.log(n) / Math.log(2)));
let max_size = 2 * parseInt(Math.pow(2, x), 10) - 1;
let st =
new
Array(max_size);
st.fill(0);
constructSTUtil(arr, 0, n - 1, st, 0);
return
st;
}
let arr = [ 1, 3, 5, 7, 9, 11 ];
let n = arr.length;
let st = constructST(arr, n);
document.write(
"Xor of values in given "
+
"range = "
+
getXor(st, n, 1, 3) +
"</br>"
);
updateValue(arr, st, n, 1, 10);
document.write(
"Updated xor of values in "
+
"given range = "
+
getXor(st, n, 1, 3) +
"</br>"
);
</script>