↓問題のページ↓
問題文通り愚直にシミュレーションすると、全てのクエリが1である場合に\(\mathcal{O}(N Q)\)の処理となってTLEするのでちょっとした工夫が必要。クエリ1が2度以上連続で入力された場合、最後に入力されたものしか最終結果には影響しないことを利用する。また、クエリ2/3を実行する際、\(A_i\)に対して操作を行う前に、直近のクエリ1による影響を処理していなければ、\(A_i\)への代入を行ってからクエリ2/3の処理を実行するものとしても、クエリ3で出力される値は変化しない。したがって、以下のように実装すると良い。
1)\(i = 0, 1, \dots , N - 1\)について、\(A_i\)に対してクエリ1の代入処理が最後に実行された手番を\(B_i\)とし、それらの値を\(-1\)で初期化する。また、全体として最後にクエリ1が入力された時の手番およびその時に代入される整数\(s, t\)を用意し、それらの値を\(-1\)で初期化する。\(j = 0, 1, \dots , Q - 1\)について、各クエリを処理していく。
2)手番\(j\)でクエリ1が入力された場合、\(s, t\)にそれぞれ\(j, x\)を代入する(同一の手番で2つ以上のクエリを同時に処理することはないため、クエリ2/3では必ず\(j \gt s\)が成立する)。
3)手番\(j\)でクエリ2が入力された場合、\(s \ne -1\)かつ\(B_i \lt s\)ならば\(B_i, A_i\)にそれぞれ\(j, t\)を代入する(成立しなければ何もしない)。その後、\(A_i\)に\(x\)を加算する。
4)手番\(j\)でクエリ3が入力された場合、\(s \ne -1\)かつ\(B_i \lt s\)ならば\(B_i, A_i\)にそれぞれ\(j, t\)を代入する(成立しなければ何もしない)。その後、\(A_i\)を出力する。
このように処理すれば、各クエリでは数列\(A\)の1つの項にしか触らなくなるため、\(\mathcal{O}(Q)\)に改善できる。