No.043 C
が となるように変換する. そうすると, の転倒数が と の転倒距離となる.
そしてこの転倒数は隣接互換の積の数である. よって, この隣接互換の積を半分に分けて前半のみを にかけていけば は からも からも等しい転倒距離にある順列となる. 当然ながら の転倒数が奇数であれば は存在しない.
の転倒数の計算には Binary Indexed Tree を使う. を最初から見ていき, のインデックスの値をインクリメントする. そして区間 の合計を転倒数に足していく.
から の転倒数の半分の隣接互換をかけるのも Binary Indexed Tree を使う. 最初にすべてのインデックスの値を1としておく. そして を最初から見ていき, のインデックスの値をデクリメントする. を残りの中で一番左にもっていくのに必要な互換の積の数は区間 の合計であるので, 残りの転倒数がこれよりも大きければ を左に持っていき, 残りの転倒数から を左にもっていくのに必要な互換の積の数を引く. 残りの転倒数がこれよりも小さければ, を残りの転倒数の数だけ左に移動させる.