分子の列を表す配列Pと,分子の位置を表す配列Rを用意する. PはP[i] = iとして初期化する.RはR[P[i]] = i なる配列である. 例えばP = {3, 6, 5, 4, 1, 2}のときR = {5, 6, 1, 4, 3, 2}となる.

各クエリを順番に処理すると,始点sと終点tをそれぞれ伸縮させてシミュレーションを行うことになる. 伸縮は以下の場合分けで交換処理を行う:

末尾に追加するときswap(R[P[a]], R[P[b]])
末尾を削除するときswap(P[a], P[b])
先頭に追加するときswap(P[R[a]], P[R[b]])
先頭を削除するときswap(R[a], R[b])

PとRを使って,1回の伸縮はO(1)で行うことはできるが,伸縮の幅はO($K$)となり, 愚直なアルゴリズムはO($QK$)となる. クエリを先読みしてsとtを基準にソートして処理してもコーナーケースが存在し,オーダーは変わらない.

クエリを先読みし,平方分割を行い高速化できる. 入れ替え手順の長さ$K$を長さ$\sqrt{K}$の区画に分割し,クエリの左端を区画のバケットに入れていく. このとき、区画が同じクエリは右端の座標で整列しておく. 区画ごとに整理しておけば各クエリを処理するシミュレーションの計算量は, 左端については1つのクエリあたり最大$\sqrt{K}$回移動するのでO($Q\sqrt{K}$), 右端についてはそれぞれの区画ごとに最大$K$回移動するのでO($K\sqrt{K}$)となる.