AT_xmascontest2015_e Esolang?
Description
[problemUrl]: https://atcoder.jp/contests/xmascontest2015noon/tasks/xmascontest2015_e
$ N $ 個のうさぎ小屋があり、$ M $ 羽のうさぎさんがいる。 各うさぎ小屋には $ 1 $ ~ $ N $ の番号が振られており、各うさぎさんには $ 1 $ ~ $ M $ の番号が振られている。
あなたの仕事は以下のようなクエリが $ Q $ 個与えられるので、順に処理することである。
- タイプ $ 1 $ : 番号 $ Y $ のうさぎさんがうさぎ小屋 $ X $ の中に入る。
- タイプ $ 2 $ : うさぎ小屋 $ X $ に入っているうさぎさんのうち、最初に入ったうさぎさんを $ 1 $ 番目として、$ Y $ 番目にうさぎ小屋に入ったうさぎさんの番号を答える。
あなたはこのクエリの処理を次の言語概要で述べる言語で実装しなければならず、「初期化処理」「タイプ $ 1 $ のクエリの処理」「タイプ $ 2 $ のクエリの処理」の $ 3 $ 種類のプログラムを作成し、そのソースコードを提出しなければならない。フォーマットは出力の項を参照すること。
ただし、ただ実装するだけでなく、言語概要で述べられている BNF 内の非終端記号 expr の評価回数が与えられる定数 $ L $ 以下でなくてはならない。
Input Format
入力は以下の形式で記述されているが、採点プログラムがあなたの記述したプログラムに定数として与えるので、あなたは意識する必要がない。 インタプリタを利用したテストの際は参考にすること。
> $ N $ $ M $ $ Q $ $ L $ $ T_1 $ $ X_1 $ $ Y_1 $ $ T_2 $ $ X_2 $ $ Y_2 $ : $ T_Q $ $ X_Q $ $ Y_Q $
- $ 1 $ 行目には、うさぎ小屋の数 $ N $、うさぎさんの数 $ M $、クエリの数 $ Q $、非終端記号exprの呼び出し上限回数 $ L $が書かれている。$ N,M,Q,L $ の制約は部分点の項を参照せよ。
- $ 2 $ 行目からの $ Q $ 行のうち $ i\ (1≦i≦Q) $ 行目には、$ i $ 番目のクエリの情報が与えられる。これは $ i $ 番目に、タイプ $ T_i(1≦T_i≦2) $ のクエリを $ (X,Y)=(X_i,Y_i) $ として呼び出すことを意味する。
- タイプ $ 1 $ のクエリにおいて、一羽のうさぎさんが複数のうさぎ小屋に入るようなクエリは与えられない。
- タイプ $ 2 $ のクエリにおいて、答えが存在しないようなクエリは与えられない。
Output Format
出力は標準出力に行うこと(catを用いることを推奨する)。
あなたは指定された言語で書かれたプログラムソース自体を出力しなければならない。また、
> 初期化処理 ---- タイプ $ 1 $ のクエリの処理 ---- タイプ $ 2 $ のクエリの処理
のように"----"で区切られた形式でならなければならない。各処理は空であってはならず、必ず $ 1 $ つ以上の命令を含まなければならない。
*コメントも含めマルチバイト文字を含んでいる場合、javascript 版で動作したとしても、ジャッジ側で正しく動作しない可能性があるので含まないこと。*
末尾の改行はあっても無くても採点プログラムの動作に影響はない。
あまりにも長すぎるコード(数MB規模)は正しく採点されない可能性が高い。その場合 IE(内部エラー) となる。また、プログラムの実行時間に、採点プログラムの動作時間は含まれない。
Explanation/Hint
### ストーリー
*くろうさ「通常言語を使用するのは甘え」*
*しろうさ「……嫌な予感」*
*くろうさ「足し算と引き算は許してあげる」*
*しろうさ「えっとえっと」*
*くろうさ「特殊な形のwhile文は使ってもいいよ。あ、他にも色々制限しちゃう」*
*しろうさ「条件分k*
*くろうさ「というわけで今回もがんばってねっ」*
*(元ネタ:Xmas Contest 2014 Problem A: A+B Problem)*
### 言語概要
実装に使用する言語には、以下のような特徴がある。
- メモリは基本的に、それぞれの要素に $ [0,9999] $ の範囲の整数のみが格納できる長さ $ 10000 $ の配列 $ a $ のみである。a\[i\] で $ i $ 番目(0-indexed)の要素にアクセスできる。タイプ $ 2 $ のクエリでは、答えを格納する変数 $ A $ が利用できる。
- 使用できる定数も $ [0,9999] $ の範囲の整数である。
- 演算の途中過程で現れる数値も $ [0,9999] $ の範囲に収まっていなければならず、収まっていない場合エラーとなる。足し算と引き算は全て左結合で行われる。
- 用いることができる主な機能は、「代入」「加算・減算」「while (式 < 式) {実行文}」のみである。while(式<式){実行文}は、"式<式" が真の間のみ実行文を実行する繰り返し文である。
- 入力は定数を通して受け取る。
- タイプ $ 2 $ に対する回答は、変数 $ A $ への代入という形で行う。 $ A $ へのアクセスはクエリ毎に $ 1 $ 度しかできず、$ 2 $ 度以上アクセスした場合エラーとなる。
- 各セクション(初期化、タイプ $ 1 $、タイプ $ 2 $ )によって、参照・代入できる定数・変数が異なる。そのセクションで使えない定数・変数に対する操作をしようとするとエラーとなる。
各セクションで使える定数一覧は次の通りである。
- 初期化: $ N,M $
- タイプ1: $ N,M,X,Y $
- タイプ2: $ N,M,X,Y $
各セクションで使える変数一覧は次の通りである。
- 初期化: $ a $
- タイプ1: $ a $
- タイプ2: $ a,A $
言語の BNF は以下の通りである。
```
::= | "\n"
::= |
::= "="
::= | "+" | "-"
::= "while(" "