56. 最小値の取得の実装
// [a, b) の最小値,l, r にはノード k に対応づく区間を与える
int query(int a, int b, int k, int l, int r) {
if (r <= a || b <= l) return INT_MAX; // 交差しない?
if (a <= l && r <= b) return dat[k]; // 完全に含む?
else {
int vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
int vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
return min(vl, vr);
}
}
外からは query(a, b, 0, 0, n) のように呼ぶ
(ここまで閉区間で説明してきたが,関数は半開区間なことに注意)