let MAX = 1000;
let tree =
new
Array(MAX).fill(0);
let 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
;
}
let mid = (ss + se) / 2;
updateRangeUtil(Math.floor(si * 2 + 1), Math.floor(ss), Math.floor(mid), Math.floor(us), Math.floor(ue), Math.floor(diff));
updateRangeUtil(Math.floor(si * 2 + 2), Math.floor(mid + 1), Math.floor(se), Math.floor(us), Math.floor(ue), Math.floor(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];
let mid = (ss + se) / 2;
return
getSumUtil(Math.floor(ss), Math.floor(mid), Math.floor(qs), Math.floor(qe), Math.floor(2 * si + 1))
+ getSumUtil(Math.floor(mid + 1), Math.floor(se), Math.floor(qs), Math.floor(qe), Math.floor(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 = (ss + se) / 2;
constructSTUtil(arr, Math.floor(ss), Math.floor(mid), Math.floor(si * 2 + 1));
constructSTUtil(arr, Math.floor(mid + 1), Math.floor(se), Math.floor(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)}`);