#arc049d. [arc049_d]すわっぷしまーす

[arc049_d]すわっぷしまーす

問題文

高橋君は旅行先で、「すわっぷしまーす」という不思議な完全二分木を観光しました。

「すわっぷしまーす」は、高さが N+1N+1 で葉の個数が 2N2^N の完全二分木です。そして、葉には左から順に 1,2,3,...,2N1, 2, 3, ..., 2^N と数が書かれています。

また、葉以外の頂点について、上から ii 段目 (1iN)(1 ≦ i ≦ N)、左から jj 番目 (1j2i1)(1 ≦ j ≦ 2^{i-1}) ならば位置 2i1+(j1)2^{i-1} + (j-1) となるように位置というものを定義します。

さらに、rmswap(x){\\rm swap}(x) というものを定義します。これは、位置 xx となる頂点を求め、左右の部分木を入れ替えるという動作です。

「すわっぷしまーす」は、以下の 22 種類のクエリを処理できます。

タイプ1: k(1k2N)k(1 ≦ k ≦ 2^N) が与えられるので、左から kk 番目の葉に書かれた数を求める。

タイプ2: a,b(1ab2N1)a, b(1 ≦ a ≦ b ≦ 2^N - 1) が与えられるので、${\\rm swap}(a), {\\rm swap}(a+1), {\\rm swap}(a+2), ..., {\\rm swap}(b)$ と、この順番で実行する。

高橋君は、旅行から帰った後、自分でも「すわっぷしまーす」を作りたくなりました。しかしなかなか難しいので、あなたが代わりに作ることになりました。

具体的には、NN と、QQ 個のクエリが与えられるので、それを処理できるような「すわっぷしまーす」を作ってください。


入力

入力は以下の形式で標準入力から与えられる。

NN QQ t1t_1 a1a_1 b1b_1 t2t_2 a2a_2 b2b_2 : tQt_Q aQa_Q bQb_Q

  • 11 行目には整数 N(1N17)N(1 ≦ N ≦ 17), Q(1Q200,000)Q(1 ≦ Q ≦ 200,000) が空白区切りで与えられる。
  • 22 行目から QQ 行には、クエリの内容が与えられる。そのうち ii 行目には、33 つの整数 tit_i, aia_i, bib_i が空白区切りで与えられる。
  • ti=1t_i = 1 の時、タイプ1のクエリである。 aia_i が問題文中の kk を表し、bib_i は必ず 00 である。
  • ti=2t_i = 2 の時、タイプ2のクエリである。 aia_i, bib_i はそれぞれ問題文中の aa, bb を表す。

出力

タイプ1のクエリが来る度に、求めた値を出力する。出力する度に改行を入れる事。


入力例1

3 10
2 5 5
1 1 0
1 2 0
1 3 0
1 4 0
2 1 3
1 2 0
1 3 0
1 5 0
1 6 0

出力例1

1
2
4
3
8
5
4
3

このサンプルでは、2回タイプ2のクエリが来ます。

1回目のタイプ2のクエリの後は下図のようになっています。

D_img0

2回目のタイプ2のクエリの後は下図のようになっています。

D_img1