import
java.util.*;
class
GFG {
static
int
getSum(
int
BITree[],
int
index)
{
int
sum =
0
;
index = index +
1
;
while
(index >
0
) {
sum += BITree[index];
index -= index & (-index);
}
return
sum;
}
static
void
updateBIT(
int
BITree[],
int
n,
int
index,
int
val)
{
index = index +
1
;
while
(index <= n) {
BITree[index] += val;
index += index & (-index);
}
}
static
int
sum(
int
x,
int
BITTree1[],
int
BITTree2[])
{
return
(getSum(BITTree1, x) * x)
- getSum(BITTree2, x);
}
static
void
updateRange(
int
BITTree1[],
int
BITTree2[],
int
n,
int
val,
int
l,
int
r)
{
updateBIT(BITTree1, n, l, val);
updateBIT(BITTree1, n, r +
1
, -val);
updateBIT(BITTree2, n, l, val * (l -
1
));
updateBIT(BITTree2, n, r +
1
, -val * r);
}
static
int
rangeSum(
int
l,
int
r,
int
BITTree1[],
int
BITTree2[])
{
return
sum(r, BITTree1, BITTree2)
- sum(l -
1
, BITTree1, BITTree2);
}
static
int
[] constructBITree(
int
n)
{
int
[] BITree =
new
int
[n +
1
];
for
(
int
i =
1
; i <= n; i++)
BITree[i] =
0
;
return
BITree;
}
public
static
void
main(String[] args)
{
int
n =
5
;
int
[] BITTree1;
int
[] BITTree2;
BITTree1 = constructBITree(n);
BITTree2 = constructBITree(n);
int
l =
0
, r =
4
, val =
5
;
updateRange(BITTree1, BITTree2, n, val, l, r);
l =
2
;
r =
4
;
val =
10
;
updateRange(BITTree1, BITTree2, n, val, l, r);
l =
1
;
r =
4
;
System.out.print(
"Sum of elements from ["
+ l +
","
+ r +
"] is "
);
System.out.print(rangeSum(l, r, BITTree1, BITTree2)
+
"\n"
);
}
}