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