セグ木(モノイド設計)
| 投稿者 | urunea |
|---|---|
| 言語 | PyPy3 |
| 更新日時 (JST) | 2026-10-24 22:43:36 |
| サイズ | 1,246 Byte |
| 参照URL | |
日時はサーバーが記録したものです。更新すると更新日時が変わるので、不都合がある場合は新しく投稿してください。
class SegTree:
def __init__(self, op, e, v):
n = len(v)
log = 0
while (1 << log) < n:
log += 1
size = 1 << log
d = [e] * (2 * size)
for i in range(n):
d[size + i] = v[i]
self._op = op
self._e = e
self._n = n
self._log = log
self._size = size
self._d = d
for i in range(self._size - 1, 0, -1):
self._update(i)
def _update(self, k):
self._d[k] = self._op(self._d[2 * k], self._d[2 * k + 1])
def set(self, p, x):
p += self._size
self._d[p] = x
for i in range(1, self._log + 1):
self._update(p >> i)
def get(self, p):
return self._d[p + self._size]
def prod(self, l, r):
sml = self._e
smr = self._e
l += self._size
r += self._size
while l < r:
if l & 1:
sml = self._op(sml, self._d[l])
l += 1
if r & 1:
r -= 1
smr = self._op(self._d[r], smr)
l >>= 1
r >>= 1
return self._op(sml, smr)
def all_prod(self):
return self._d[1]