解説

概要

並列二分探索でまとめて解の二分探索を行えばよいです。
シミュレート部分はBITやセグメント木で高速化可能です。

並列二分探索への帰着

QQ個の質問の代わりに、次のQQ個の判定問題を考えます。

  • インコPqP_qは、JudgeqJudge_q日目にFqF_q回以上食事をしているか?

QQ個の判定問題は、実際にDD日間シミュレートをすれば並列して解くことができます。
そして元の質問は、判定問題の「JudgeqJudge_q日目」を二分探索すれば答えが得られます。
従って適切に判定問題を定め、シミュレートをO(logD)O(logD)回行えれば本問に正解できます。

シミュレートの高速化

シミュレートを愚直に行うと時間計算量がO(ND+Q)O(ND+Q)となりTLEします。
そこで食事回数をインコの番号順ではなく序列順に管理することにすると、食事が序列順での区間加算となるため、BITやセグメント木で高速化ができます。
序列の入れ替えは、入れ替え前後の食事回数の差分を取って更新すればよいです。
シミュレート1回あたりの計算量はO(N+(D+Q)logN)O(N + (D+Q)logN)となります。

合計の計算量はO(NlogD+(D+Q)logNlogD)O(NlogD + (D+Q)logNlogD)時間・O(N+D+Q)O(N+D+Q)空間です。
なお、O(ND+QlogD)O(ND + QlogD)時間・O(N+D+Q)O(N+D+Q)空間の愚直解との差別化のため、特にPythonでは実行時間制限が厳しく設定されています。
定数倍に注意して実装をしてください。

解答例(Python)

解答例ではBITを使い、序列入れ替え時の差分を別配列に反映させています。