<script>
function
buildTree(tree, a, s, e, idx)
{
if
(s == e) {
tree[idx] = a[s];
return
;
}
let mid = Math.floor((s + e) / 2);
buildTree(tree, a, s, mid, 2 * idx);
buildTree(tree, a, mid + 1, e, 2 * idx + 1);
tree[idx] = tree[2 * idx] + tree[2 * idx + 1];
return
;
}
function
queryTree(tree, s, e, k, idx)
{
if
(k > tree[idx])
return
-1;
if
(s == e)
return
s;
let mid = Math.floor((s + e) / 2);
if
(tree[2 * idx] >= k)
return
queryTree(tree, s, mid, k, 2 * idx);
else
return
queryTree(tree, mid + 1, e, k -
tree[2 * idx], 2 * idx + 1);
}
function
updateTree(tree, s, e, i, change, idx)
{
if
(i < s || i > e) {
document.write(
"error"
);
return
;
}
if
(s == e) {
tree[idx] = change;
return
;
}
let mid = Math.floor((s + e) / 2);
if
(i >= s && i <= mid)
updateTree(tree, s, mid, i, change, 2 * idx);
else
updateTree(tree, mid + 1, e, i, change, 2 * idx + 1);
tree[idx] = tree[2 * idx] + tree[2 * idx + 1];
return
;
}
function
queries(tree, a, q, p, k, change, n)
{
let s = 0, e = n - 1, idx = 1;
if
(q == 1) {
a[p] = change;
updateTree(tree, s, e, p, change, idx);
document.write(
"Array after updation:<br>"
);
for
(let i = 0; i < n; i++)
document.write(a[i] +
" "
);
document.write(
"<br>"
);
}
else
{
document.write(
"Index of "
+ k +
"th set bit: "
+ queryTree(tree, s, e, k, idx) +
"<br>"
);
}
}
let a = [ 1, 0, 1, 0, 0, 1, 1, 1 ];
let n = a.length;
let tree =
new
Array(4 * n + 1);
for
(let i = 0; i < 4 * n + 1; ++i) {
tree[i] = 0;
}
let s = 0, e = n - 1, idx = 1;
buildTree(tree, a, s, e, idx);
let q = 0, p = 0, change = 0, k = 4;
queries(tree, a, q, p, k, change, n);
q = 1, p = 5, change = 0;
queries(tree, a, q, p, k, change, n);
</script>