時刻以降に最短で仕事を個こなすときの終了時刻
というテーブルを作っておけば、クエリに対する答えはで求まる:
result := 0
for k from 16 downto 0
if R[k][QL] <= QR
result += 2^k
QL := R[k][QL]
return result
ただし、このままでは時刻の範囲が大きすぎるのでに現れる時刻をまとめて座標圧縮しておく。
また、を初期化するために、時刻以降に最初にこなすべき仕事(の終了時刻)を求めてなくてはならないが、を終了時刻の昇順でソートしておいて順に処理していけばよい。
仕事を終えた後に最短で仕事を個こなすときの最後の仕事
という感じで仕事ベースでテーブルを作っておけば座標圧縮しなくても良いらしい。なるほど……