ホテルから日以内にたどり着けるもっとも右のホテル
というテーブルを作ってクエリに答えればいいのだが、ダブリングの実装でいつももたついているのでメモしておく。
のサイズについて。制約より、高々日でどの地点からどの地点にも移動できるので、テーブルはであるような最大のまで作ってあれば十分である。この場合は、ただし、日のデータも必要なので、のサイズとしてはになる。計算が面倒or不安なら多めに取っても問題ない。
更新について。のデータだけ二分探索等で作れば、についてはで得られる。
クエリについて。クエリを処理する時は、の順でにたどり着かないように採用していって、最後に1を足すのが一番簡単そう。疑似コードで書くと、
sum := 0
for k from 16 downto 0
if R[k][a] < b
sum += 2^k
a := R[k][a]
return sum + 1
最初、なぜか非対称だと思って右に行く場合のテーブルと左に行く場合のテーブルを作ってしまった。