I - 重要証拠 (Important evidence)
Editorial
/
まず、データ1からデータTまでのT種類のデータがある。
i種類目のデータは、それぞれあるビット列S_iで構成されている。
続いて、以下の3種類の行動を何回か行う。
Time Limit: 2 sec / Memory Limit: 512 MB
問題文
joisinoお姉ちゃんは、この学校に高校生探偵がいることを知り、彼のもとを訪ねることにした。
訪ねると彼は、珍しくとても困っているようだった。
というもの、事件の重要な証拠となりうるパソコンを発見したのだが、肝心のデータが抜き取られていたらしい。
しかし、行われた操作のログは残っているので、それをもとにデータの復元ができれば事件はすぐに解決するという。
joisinoお姉ちゃんは優秀なプログラマーであることを見込まれ、データの復元に取り掛かることにした。
パソコンで行われていた操作は以下のようなものである。
i種類目のデータは、それぞれあるビット列S_iで構成されている。
あるデータを以下の方法で別のデータと結合する。 (結合後のデータのビット列はS_a+S_bとなり、a番目とb番目のデータはこれをさすようになる。ただし、この足し算はビット列を文字列とみなして行うものとする。たとえば、eとfが同じデータをさしている場合に、eとgを結合すると、eとfとgはすべてこの結合後のデータをさすようになる。また、データaとデータbがすでに結合されている場合はこの操作を無視するものとする。)今までの処理をundoし、全てのデータの状態をk回操作を行った直後の状態に戻す。(ここでいう操作とは、結合、undo、出力のすべてである) あるデータにおいて、そのビット列の、「連続する0の個数」の最大値を出力する。
この出力こそが、事件のカギであり、抜き取られたデータである。
優秀なプログラマーであるjoisinoお姉ちゃんは、パソコンのログをもとに、抜き取られたデータを復元するプログラムを作成した。
入力
入力は以下の形式で標準入力から与えられる。
T A L_1 R_1 L_2 R_2 : L_T R_T Q :
- 最初の行に、データの種類T(1≦T≦10^5)が与えられる。
- 次の1行に、ビット列A(1≦length(A)≦10^5)が与えられる。この使い方については、のちに説明する。
- 次のT行は、各データに割り振られるビット列を示す。
このうちi行目には整数L_i(1≦L_i≦length(A)),R_i(L_i≦R_i≦length(A))が含まれる。これはS_iがAのL_i文字目からR_i文字目までに等しいことを意味する。 - 次の1行にログの数Q(1≦Q≦10^5)が与えられる。
- 次のQ行には、ログ情報が時系列順に書かれている。
各行には2つか3つの整数が含まれる。 - 含まれる整数の数が2個のとき、最初の数字は0か1である。
- 最初の数字が0のとき、この次の数字をa_i(1≦a_i≦T)とする。
このとき、データa_iの、「連続する0の個数」の最大値を出力せよ。ただし、0がビット列に含まれない場合は0を返すものとする - 最初の数字が1のとき、この次の数字をKとする。
このとき、全てのデータはK(0≦K≦処理が完了したクエリの個数)回の操作を行った直後の状況に戻る。 - 含まれる整数の数が3個の時、最初の数字は2である。この次の数字をa_i,b_iとする。
このとき、データa_i(1≦a_i≦T)をデータb_i(1≦b_i≦T)に結合することを意味する。ただし、a_iとb_iが既に結合されている場合は無視しなければならないことに注意せよ。
配点
この問題に部分点がある。
- データセット1は、Q ≦50,length(A)≦50,T≦50を満たし、これに正解すると10点が得られる。
- データセット2では追加の制約はなく、これに正解すると150点が得られる。
出力
「入力」の項を参照してください。
また、出力の末尾には改行を入れること。
入力例1
5 11111 2 3 2 3 2 4 4 4 4 5 5 2 5 2 0 4 0 1 2 5 5 1 2
出力例1
0 0