問題一覧 > 通常問題

No.469 区間加算と一致検索の問題

レベル : / 実行時間制限 : 1ケース 5.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 48
作問者 : kimiyuki / テスター : 紙ぺーぱー
5 ProblemId : 1476 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2016-12-18 03:10:52

問題

長さNの数列x=(x0,x1,x2,,xN1)がある。 始めは数列x=(0,0,0,,0)とする。 以下の2種類のクエリがQ個与えられるので順番に処理せよ。

  • 区間加算クエリ ! L R K
    Li<Rについて、xixi+Kに更新する。
  • 質問クエリ?
    数列xが現在と同一の値を最初にとるのは何番目のクエリの後であるか答える。 初期状態は0番目のクエリの後であるとする。
    つまり、答えようとしている質問クエリをq番目のクエリ(1qQ)とし、i番目のクエリの処理後のxの値をxiと書く(初期状態のためx0=(0,0,0,,0)とする)としたとき、min{i0iQxi=xq1}を出力する。

入力

N Q
C1 ...
C2 ...
...
CQ ...

1行目には、数列の長さを表わす整数N (1N106)とクエリの数を表す整数Q (1Q105)が与えられる。 i+1行目(1iQ)には、問題文中のクエリのいずれかの形式で与えられる。 ただし区間加算クエリであるとき、区間の左端Li0Li<N、区間の右端RiLi<RiN、加算する量Ki100<Ki100を満たし、いずれも整数とする。

出力

質問クエリに対して、与えられた順番に答えを出力してください。 出力毎に改行してください。

サンプル

サンプル1
入力
3 6
! 1 3 1
! 0 2 2
! 0 3 -2
?
! 2 3 2
?
出力
3
1

処理は以下のように行われます。

  1. 始めは数列xx=(0,0,0)である。
  2. 1番目のクエリを処理する。その結果x=(0,1,1)になる。
  3. 2番目のクエリを処理する。その結果x=(2,3,1)になる。
  4. 3番目のクエリを処理する。その結果x=(0,1,1)になる。
  5. 4番目のクエリに答える。この時点でxx=(0,1,1)であり、xがこのような値をとるのは3番目のクエリを処理した後が最初であるので、3を出力する。
  6. 5番目のクエリを処理する。その結果x=(0,1,1)になる。
  7. 6番目のクエリに答える。この時点でxx=(0,1,1)であり、xがこのような値をとるのは1番目のクエリを処理した直後と5番目のクエリを処理した後である。これらの中で最も早くに処理したクエリの番号である1を出力する。

サンプル2
入力
3 2
?
?
出力
0
0

サンプル3
入力
100000 6
! 0 100000 1
! 0 100000 2
! 0 100000 3
! 0 100000 4
! 0 100000 -7
?
出力
2

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。