-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFenwickTree.cpp
More file actions
41 lines (40 loc) · 1.04 KB
/
FenwickTree.cpp
File metadata and controls
41 lines (40 loc) · 1.04 KB
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
//1-origin
template <typename T>
struct FenwickTree {
vector<T> data;
FenwickTree(int n) : data(n + 1, 0) {}
//data[i] += x
void add(int i, T x){
while (i <= (int)data.size()) {
data[i] += x;
i += i & -i;
}
}
//[1, i)
T sum(int i){
T res = 0;
while (i > 0) {
res += data[i];
i -= i & -i;
}
return res;
}
//[l, r)
T sum(int l, int r) { return sum(r) - sum(l); }
};
//0-origin
template <typename T>
struct FenwickTree {
vector<T> data;
FenwickTree(int n) : data(n, 0) {}
//v[i] += x
void add(int i, T x) { for (int p = i; p < (int)data.size(); p |= p + 1) data[p] += x; }
//[0, i)
T sum(int i) {
T s = 0;
for (int p = i - 1; p >= 0; p = (p & (p + 1)) - 1) s += data[p];
return s;
}
//[l, r)
T sum(int l, int r) { return sum(r) - sum(l); }
};