この問題 (Hard) は主に高度なデータ構造、連想配列、区間における添字の二分探索を問います。
Hardの解説です。
Easyでは最後の 個の質問に答えるのに愚直に予約数の最大値とその個数を数えていましたが、Hardでは から時間制限に間に合わないので、この部分を高速化させる必要があります。
Easyでimos法を図った配列 ( は配列 の長さ) において、各要素 (すなわち )毎に添え字をとった配列 ( は となる添え字 、また は となる の個数) とし、 を"値"、 を"キー"として持った連想配列 を用います。
このままでは において、 日目から 日目までの区間において予約数の最大値を として、"キー"が に対応する の要素において 以上 以下の要素の個数を愚直に探索することで求められますが、高速化を図ることはできません。しかし は単調増加性を持つ ( からこの順に添え字を順番に格納していくため) ことから、二分探索を用いて条件を満たす要素の個数を高速に求めることができます※。
また はどうやって求めるのかというと、これはセグメントツリーや Sparse Table などの、ある区間に対する最大値/最小値を高速に求める高度なデータ構造を用いて求めることが可能です。以上を用いることで時間制限に間に合わせることができるような実装が可能です。
※この個数を求める部分問題に似た類題 ABC248-D がありますので、そちらも参考にしてください。