# Segment Tree for RSM
class RSQ:
N # 完全二分木のノード数
n # 列の要素数 = 葉の数
sum # 和を保持する配列
# 最低限必要な列の要素数で初期化
init(len):
n ← 1
while n < len:
n ← n*2 # 葉の数nを2のべき乗にする
N ← 2*n - 1 # 完全二分木のノード数を調整する
for i ← 0 to N-1:
sum[i] ← 0
# 区間[a, b)の和を求める
findSum(a, b):
return query(a, b, 0, 0, n)
query(a, b, k, l, r):
if r ≤ a or b ≤ l:
res ← 0
else if a ≤ l and r ≤ b:
res ← sum[k]
else:
vl ← query(a, b, left(k), l, (l+r)/2)
vr ← query(a, b, right(k), (l+r)/2, r)
res ← vl + vr
return res
# k番目の要素にxを加算する
update(k, x):
k ← k + n - 1
sum[k] ← sum[k] + x
while k > 0:
k ← parent(k)
sum[k] ← sum[left(k)] + sum[right(k)]
left(k):
return 2*k + 1
right(k):
return 2*k + 2
parent(k):
return (k - 1)/2