const MAX = 1000;
const tree =
new
Array(MAX).fill(0);
const lazy =
new
Array(MAX).fill(0);
function
updateRangeUtil(si, ss, se, us, ue, diff) {
if
(lazy[si] != 0) {
tree[si] += (se - ss + 1) * lazy[si];
if
(ss != se) {
lazy[si * 2 + 1] += lazy[si];
lazy[si * 2 + 2] += lazy[si];
}
lazy[si] = 0;
}
if
(ss > se || ss > ue || se < us) {
return
;
}
if
(ss >= us && se <= ue) {
tree[si] += (se - ss + 1) * diff;
if
(ss != se) {
lazy[si * 2 + 1] += diff;
lazy[si * 2 + 2] += diff;
}
return
;
}
const mid = Math.floor((ss + se) / 2);
updateRangeUtil(si * 2 + 1, ss, mid, us, ue, diff);
updateRangeUtil(si * 2 + 2, mid + 1, se, us, ue, diff);
tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
function
updateRange(n, us, ue, diff) {
updateRangeUtil(0, 0, n - 1, us, ue, diff);
}
function
getSumUtil(ss, se, qs, qe, si) {
if
(lazy[si] != 0) {
tree[si] += (se - ss + 1) * lazy[si];
if
(ss != se) {
lazy[si * 2 + 1] += lazy[si];
lazy[si * 2 + 2] += lazy[si];
}
lazy[si] = 0;
}
if
(ss > se || ss > qe || se < qs) {
return
0;
}
if
(ss >= qs && se <= qe) {
return
tree[si];
}
const mid = Math.floor((ss + se) / 2);
return
getSumUtil(ss, mid, qs, qe, 2 * si + 1) + getSumUtil(mid + 1, se, qs, qe, 2 * si + 2);
}
function
getSum(n, qs, qe) {
if
(qs < 0 || qe > n - 1 || qs > qe) {
console.log(
"Invalid Input"
);
return
-1;
}
return
getSumUtil(0, n - 1, qs, qe, 0);
}
function
constructSTUtil(arr, ss, se, si) {
if
(ss > se) {
return
;
}
if
(ss == se) {
tree[si] = arr[ss];
return
;
}
let mid = Math.floor((ss + se) / 2);
constructSTUtil(arr, ss, mid, si * 2 + 1);
constructSTUtil(arr, mid + 1, se, si * 2 + 2);
tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
function
constructST(arr, n) {
constructSTUtil(arr, 0, n - 1, 0);
}
let arr = [1, 3, 5, 7, 9, 11];
let n = arr.length;
constructST(arr, n);
console.log(
"Sum of values in given range ="
, getSum(n, 1, 3));
updateRange(n, 1, 5, 10);
console.log(
"Updated sum of values in given range ="
, getSum(n, 1, 3));