MM回行われる座標をズラす操作のことを単に「操作」、QQ 回問われるクエリのことを単に「クエリ」と言います。

まず、操作によって各点のX座標は変化しません。よって、点をX座標に関してソートしたときに、操作 x a は、

  • ソートした配列において、X座標が xx 未満の部分の yy 座標を a-a し、X座標が xx 以上の部分の yy 座標を +a+a する

と言い換えることが出来ます。この加算は、あるインデックスを境にして、それ以前の範囲に a-a を加算、それ以降の範囲に +a+a を加算することで可能です。 このインデックスの位置に関しては二分探索を使って求めることができ、この範囲加算はいもす法を用いることで可能です。

計算量は、

  • 点をソートするのに O(logN)O(\log N)

「二分探索」や「いもす法」について知らない場合は、以下のような資料、または「鉄則本」といわれる本を見てみましょう

二分探索

いもす法

Bouns: この問題では、MM 回の操作の後に QQ 回のクエリがありましたが、「操作」と「クエリ」がランダムに交互に来る場合でも解答することが出来ます。 気になる人は、「遅延セグ木」や「双対セグ木」という言葉で検索してみてください。

解答例(c++)

https://mojacoder.app/users/n_bitand_n_per_3/problems/Suddenly_A_Tempest_2/submissions/84977536-8c61-48e9-99e2-c9ac0db621de