回行われる座標をズラす操作のことを単に「操作」、 回問われるクエリのことを単に「クエリ」と言います。
まず、操作によって各点のX座標は変化しません。よって、点をX座標に関してソートしたときに、操作 x a は、
と言い換えることが出来ます。この加算は、あるインデックスを境にして、それ以前の範囲に を加算、それ以降の範囲に を加算することで可能です。 このインデックスの位置に関しては二分探索を使って求めることができ、この範囲加算はいもす法を用いることで可能です。
計算量は、
「二分探索」や「いもす法」について知らない場合は、以下のような資料、または「鉄則本」といわれる本を見てみましょう
Pythonには、lower_bound に対応するものとして bisect_left, uppper_bound に対応するものとして bisect_right が存在します。返り値の仕様はイテレータかインデックスか違いでしかないのでほぼ同様に使えます。
Bouns: この問題では、 回の操作の後に 回のクエリがありましたが、「操作」と「クエリ」がランダムに交互に来る場合でも解答することが出来ます。 気になる人は、「遅延セグ木」や「双対セグ木」という言葉で検索してみてください。
解答例(c++)