This documentation is automatically generated by online-judge-tools/verification-helper
列に対する一点加算、区間和取得を計算量 $O(\log n)$ で行えるデータ構造。
BinaryIndexedTree(n: int)
長さ $n$ の Binary Indexed Tree を構築する。初期値はすべて $0$ である。計算量 $O(n)$
build(array: Sequence[int]) -> None
Binary Indexed Tree を配列 array
で初期化する。計算量 $O(n)$
add(i: int, val: int) -> None
$i$ 番目の要素に val
を加える。計算量 $O(\log n)$
sum(l: int, r: int) -> int
$\lbrack l, r)$ 番目の要素の総和を返す。計算量 $O(\log n)$
bisect_left(val: int) -> int
$\lbrack 0, r)$ 番目の要素の総和が val
以上となる最小の $r$ を返す。そのような $r$ が存在しない場合は $n + 1$ を返す。計算量 $O(\log n)$
class BinaryIndexedTree:
def __init__(self, n):
self.size = n
self.bit = [0] * (self.size + 1)
def build(self, array):
for i, val in enumerate(array):
self.bit[i + 1] = val
for i in range(1, self.size):
if i + (i & -i) > self.size:
continue
self.bit[i + (i & -i)] += self.bit[i]
def _sum(self, i):
s = 0
while i > 0:
s += self.bit[i]
i -= i & -i
return s
def add(self, i, val):
i += 1
while i <= self.size:
self.bit[i] += val
i += i & -i
def sum(self, l, r):
"""sum of values in range [l, r)"""
return self._sum(r) - self._sum(l)
def bisect_left(self, val):
"""minimum idx s.t. sum[0, idx) >= val"""
if val <= 0:
return 0
idx = 0
k = 1 << self.size.bit_length()
while k:
if idx + k <= self.size and self.bit[idx + k] < val:
val -= self.bit[idx + k]
idx += k
k >>= 1
return idx + 1
Traceback (most recent call last):
File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/hostedtoolcache/Python/3.12.4/x64/lib/python3.12/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
raise NotImplementedError
NotImplementedError