-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFenwickTree.h
50 lines (44 loc) · 1.12 KB
/
FenwickTree.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <vector>
template<typename T, typename BinaryOperation = std::plus<T>,
typename InverseOperation = std::minus<T>>
class FenwickTree
{
public:
explicit FenwickTree(int n, T identity = T(),
const BinaryOperation& op = BinaryOperation(),
const InverseOperation& op_i = InverseOperation())
: ft(n + 1, identity), id(identity), f(op), f_i(op_i) {}
T query(int b) const
{
T sum = id;
for (; b; b -= b & -b) sum = f(sum, ft[b]);
return sum;
}
T query(int a, int b) const
{
if (a == 1) return query(b);
return f_i(query(b), query(a - 1));
}
void adjust(int k, T v)
{
for (; k < static_cast<int>(ft.size()); k += k & -k) {
ft[k] = f(ft[k], v);
}
}
T getSingle(int k) const
{
T sum = ft[k];
int z = k - (k & -k);
--k;
while (k != z) {
sum = f_i(sum, ft[k]);
k -= k & -k;
}
return sum;
}
private:
std::vector<T> ft;
T id;
BinaryOperation f;
InverseOperation f_i;
};