Skip to content

Commit 01008a0

Browse files
committed
🥺chore
1 parent fd4ea95 commit 01008a0

File tree

1 file changed

+43
-38
lines changed

1 file changed

+43
-38
lines changed

snipetts/binary_indexed_tree.py

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,47 @@
1-
class Bit:
2-
def __init__(self, n, default=0): self.size, self.tree = n, [default] * (n + 1)
3-
# get sum of [0, i]
4-
def sum(self, i):
5-
s = 0
1+
class BIT:
2+
def __init__(self, li):
3+
self.n, self.data = len(li) + 1, [0] + li
4+
for i in range(1, self.n):
5+
if i + (i & -i) < self.n: self.data[i + (i & -i)] += self.data[i]
6+
7+
def add(self, i, a):
8+
i += 1
9+
while i < self.n:
10+
self.data[i] += a
11+
i += i & -i
12+
13+
# sum of [0, i)
14+
def acc(self, i):
15+
res = 0
616
while i > 0:
7-
s += self.tree[i]
17+
res += self.data[i]
818
i -= i & -i
9-
return s
19+
return res
1020

11-
def add(self, i, x):
12-
i = max(i, 1)
13-
while i <= self.size:
14-
self.tree[i] += x
15-
i += i & -i
21+
# sum of [l, r)
22+
def get(self, l, r = None):
23+
if r is None: r = l+1
24+
return self.acc(r) - self.acc(l)
25+
26+
27+
# class ExBIT:
28+
# def __init__(self, n):
29+
# self.p = Bit(n + 1)
30+
# self.q = Bit(n + 1)
31+
32+
# # add x to [l, r] (not [l, r)])
33+
# def add(self, x, l, r=None):
34+
# if r is None: r = l
35+
# r += 1
36+
# self.p.add(l, -x * l)
37+
# self.p.add(r, x * r)
38+
# self.q.add(l, x)
39+
# self.q.add(r, -x)
40+
41+
# def sum(self, l, r):
42+
# r += 1
43+
# return self.p.sum(r) + self.q.sum(r) * r - self.p.sum(l) - self.q.sum(l) * l
1644

17-
# get sum of [l, r], or just l
18-
def get(self, l, r=None):
19-
if r is None: r = l
20-
return self.sum(r) - self.sum(l-1)
21-
22-
class ExBIT:
23-
def __init__(self, n):
24-
self.p = Bit(n + 1)
25-
self.q = Bit(n + 1)
26-
27-
# add x to [l, r] (not [l, r)])
28-
def add(self, x, l, r=None):
29-
if r is None: r = l
30-
r += 1
31-
self.p.add(l, -x * l)
32-
self.p.add(r, x * r)
33-
self.q.add(l, x)
34-
self.q.add(r, -x)
35-
36-
def sum(self, l, r):
37-
r += 1
38-
return self.p.sum(r) + self.q.sum(r) * r - self.p.sum(l) - self.q.sum(l) * l
39-
40-
def get(self, l, r=None):
41-
if r is None: r = l
42-
return self.sum(l, r)
45+
# def get(self, l, r=None):
46+
# if r is None: r = l
47+
# return self.sum(l, r)

0 commit comments

Comments
 (0)