ABC476 E - Min-Max Swap

最大最小交換

考え方

区間内の最大値と最小値を高速に取得する方法さえ知っていれば、それ以外はC問題レベル。
逆写像を作っておくことで、最大値と最小値の位置を高速に調べる。
そして、それら $2$ つの位置の情報を入れ替える。

さて、区間内の最大値と最小値を高速に取得する方法だが、これはsegment木でよい。
同じsegment木で最大も最小も求められるようにしてもよいし、segment木を $2$ つ作ってもよい。
$2$ つの位置の情報を入れ替えるときに、segment木上の情報も入れ替える。
ただ、これだけである。

計算量は $O((N+M)\log N)$ である。

入力例1での動作

入力を受け取る。

n: 5
m: 3
p: {3, 1, 4, 2, 5}
query:
  {1, 3}
  {1, 5}
  {1, 4}

最初に、値から現在位置を引けるように逆写像 pos を作っておく。
pos[x] は、値 $x$ が p の何番目にあるかを 0-indexed で表すものとする。
pos[0] はダミーとして、初期状態は次のようになる。

p:   {3, 1, 4, 2, 5}
pos: {-, 1, 3, 0, 2, 4}

また、区間最大値と区間最小値を取得できる segment 木を用意する。

最初のクエリは区間 $[1,3]$ である。
この区間の最小値は $1$、最大値は $4$ で、pos[1]=1、pos[4]=2 からそれぞれ p の $1$ 番目、$2$ 番目にある。
この $2$ つの位置を入れ替え、逆写像も更新すると、次のようになる。

p:   {3, 4, 1, 2, 5}
pos: {-, 2, 3, 0, 1, 4}

segment 木の情報も、この入れ替えを反映して更新する。

次のクエリは区間 $[1,5]$ である。
この区間の最小値は $1$、最大値は $5$ で、pos[1]=2、pos[5]=4 からそれぞれ p の $2$ 番目、$4$ 番目にある。
この $2$ つの位置を入れ替え、逆写像も更新すると、次のようになる。

p:   {3, 4, 5, 2, 1}
pos: {-, 4, 3, 0, 1, 2}

segment 木も同様に更新する。

最後のクエリは区間 $[1,4]$ である。
この区間の最小値は $2$、最大値は $5$ で、pos[2]=3、pos[5]=2 からそれぞれ p の $3$ 番目、$2$ 番目にある。
この $2$ つの位置を入れ替え、逆写像も更新すると、次のようになる。

p:   {3, 4, 2, 5, 1}
pos: {-, 4, 2, 0, 1, 3}

したがって、答えは

3 4 2 5 1

である。

注意点

特になし。

別解

特になし。