存在しない場合はその旨を報告。番目の値の中で、最小値とそのインデックスを求める。複数ある場合は、最も左端の*2インデックスを求めること。解答1通常の「区間の最小値(minとおく)」を持つRMQセグメントツリーに、「区間内の最小インデックスの和(sumIndexとおく)」を持たせればよい。32bit整数に収まらないことがあるので注意(露骨な罠)解答例では、区間に入ってる値たちをクラスに包んで実装してみた*3*4。値をコピーする関数(clone)解答2追加の情報を持たせる必要はないが、探索を少し工夫する。区間最小値を求める時と同じノリで、場合分けをしよう。適当な大きい数を返そう。適当な大きい数を返そう。そのインデックスが答え。左の子に対して再帰関数を呼ぶ。右の子に対して再帰関数を呼ぶ。解答3区間更新クエリに対する常套手段として、区間更新を最も広い区間たちで一旦受け止めておいて、区間を触るときに子に伝搬するというテクニックがある。高度な概念になるが、本稿では理屈については扱わず適用方法だけを述べる。*5「最小値(min)」「最左インデックス(minIndex)」に加え、「遅延評価中の最小値(delayMin)」「遅延評価中の最左インデックス(delayMinIndex)」を持っておく。どちらも、上から降りていく形で作業が進むが、このとき区間にたどり着くたびに、以下の処理を行う。空の場合、何もしない。子がいない場合は終了。右の子に下ろすとき、値を変更する必要があるので注意。*6また、左右の子の再帰関数から戻ってきた後は、以下の処理を行う。解答コード長いのでリンクのみ示す。Solitaire日本語につき問題文は略。disorder日本語につき問題文は略。Moneymanager月別アーカイブはてなブログをはじめよう!hama_DUさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。