ABC470 D - Inverse and Swap

逆写像と交換

考え方

クエリ2が逆写像をつくることを要求している。
しかし、これを何度も繰り返すなら、何度も作り直すより、常に本体と逆写像を両方持っておくのが早い。
C++なら、swap() を使えば $O(1)$ で配列の交換ができ、クエリ $2$ はそれでよい。

あとはクエリ $1$。
これも、元配列の $x$ と $y$ を入れ替えるなら、逆配列の対応するところも同時に入れ替えるだけ。

計算量は $O(N+Q)$ である。

入力例1での動作

入力を受け取る。
p[0]inv[0] はダミーとし、p, inv1-indexed で扱う。

p:   {-, 2, 1, 3, 5, 4}
inv: {-, 2, 1, 3, 5, 4}

$1$ 個目のクエリは 1 2 4 である。
p[2]p[4] を入れ替え、それに対応する inv の要素も入れ替える。

p:   {-, 2, 5, 3, 1, 4}
inv: {-, 4, 1, 3, 5, 2}

$2$ 個目のクエリは 2 である。
p とその逆置換 inv を入れ替える。

p:   {-, 4, 1, 3, 5, 2}
inv: {-, 2, 5, 3, 1, 4}

$3$ 個目のクエリは 1 2 3 である。
p[2]p[3] を入れ替え、それに対応する inv の要素も入れ替える。

p:   {-, 4, 3, 1, 5, 2}
inv: {-, 3, 5, 2, 1, 4}

$4$ 個目のクエリは 1 3 4 である。
p[3]p[4] を入れ替え、それに対応する inv の要素も入れ替える。

p:   {-, 4, 3, 5, 1, 2}
inv: {-, 4, 5, 2, 1, 3}

$5$ 個目のクエリは 2 なので、再び pinv を入れ替える。

p:   {-, 4, 5, 2, 1, 3}
inv: {-, 4, 3, 5, 1, 2}

最後に p を順に出力するので、答えは次のようになる。

4 5 2 1 3

注意点

特になし。

別解

特になし。