この問題は、Mo's Algorithm を用いることで解くことができます。

区間 [l,r][l, r] に対して答えを求められたとき、この区間の両端を追加、削除するときの処理を考えてみましょう。

まず、以下の配列を定義します。

cnt[i]:cnt[i] : 区間の中にある ii の個数
reach[j]:reach[j] : 区間の中にある値の個数が jj であるような個数 (つまり、cnt[i]cnt[i] = jj を満たす ii の個数)

そうすると、区間の両端の追加、削除は以下のように処理できます。

  • AxA_x を区間に追加する場合:

〇 区間の長さが 00、または cnt[Ax]=0cnt[A_x] = 0 であった場合には 11 が答えになる。
reach[cnt[Ax]]reach[cnt[A_x]]11 であるかつ、答えが cnt[Ax]cnt[A_x] と等しい場合は答えを 11 増加させる。

  • AxA_x を区間から削除する場合:

〇 削除したあとに区間の長さが 00 になる場合は何も行わない。
cnt[Ax]cnt[A_x]22 以上であるかつ、答えが cnt[Ax]cnt[A_x] と等しい場合は答えを 11 減少させる。
reach[cnt[Ax]]reach[cnt[A_x]]11 であるかつ、cnt[Ax]cnt[A_x]11 である場合は、答えを 1reach[i]1 \leq reach[i] を満たす最小の ii に変更する (二分探索などを用いる)。

上記の処理を行った後に、cntcntreachreach の更新を行うことでこの問題を解くことができます。

結果として、この問題を O(NQlogN)O(N \sqrt{Q} \log N) で解くことができ、十分に高速です。