問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
根を 0 として、各ノードに順番に番号が割り当てられた二分木を考えます。この二分木では、親ノードの番号を 2 倍して 1 または 2 を足したものが子ノードの番号となっています。
長さ N の単語列と数列が与えられます。この単語列と数列のインデックスと、二分木の番号が対応しており、
数列の"親の番号"番目の要素は、"子の番号"番目の要素以下であるという条件(*)が成り立っています。
・push word num
:
num を数列の末尾に追加し、条件(*)が成り立つように STEP 4 と同様の操作をして数列の要素を入れ替える。
word も同様に単語列の末尾に追加し、数列でおこなった入れ替えと同じ入れ替え操作を単語列でもおこなう。
・pop
:
単語列の先頭の要素を出力する。その後、数列の最後尾の要素を先頭の要素に置き換えて条件(*)が成り立つように
STEP 6 と同様の操作をして数列の要素を入れ替える。単語列も同様に末尾の要素を先頭の要素に置き換えて
数列でおこなった入れ替えと同じ入れ替え操作をおこなう。単語列と数列の長さが 1 の場合は、
単語列の先頭の要素を出力した後、単語列と数列の要素をすべて削除する。
N Q
w_0 ... w_{N-1}
a_0 ... a_{N-1}
q_1
...
q_Q
push word_j num_j
pop
push
, pop
のいずれか)が与えられ、push
の場合はさらに文字列 word_j と 整数 num_j が与えられます。種類が pop
であるクエリの数を q_pop として、合計 q_pop + 1 行出力してください。 j 行目では、種類が pop
となる j 番目のクエリに従って出力してください。(1 ≦ j ≦ q_pop) q_pop + 1 行目には、すべてのクエリが終了したあとの単語列の要素を左から順番に半角スペース区切りで出力してください。
また末尾に改行をいれ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
push
)push
)pop
であるクエリは次に与えられないことが保証されています。
7 2
alpaca banana camera donuts eclair flower ginger
1 3 7 5 12 9 10
push hammer 2
pop
alpaca
hammer banana camera donuts eclair flower ginger
1 8
donuts
5
pop
push eclair 3
push banana 10
push ginger 8
push alpaca 9
pop
push flower 7
push camera 6
donuts
eclair
camera flower banana alpaca ginger