Problem:
B: ピボット (Pivots)

問題

1 から N までの整数を並び変えた、長さ N の順列 a_1, a_2, ..., a_N が与えられる。
また、この順列に対して Q 個のクエリが順に与えられる。i 番目のクエリでは次の操作をしなければならない。

値 q_i (1 \leq q_i \leq N) が与えられる。順列 \{a_1, a_2, ..., a_N\} において q_i の左側の順列を L、q_i の右側の順列を R としたとき、元の順列 L \ \ q_i \ \ R を R \ \ q_i \ \ L に変更する。つまり、q_{i} = a_j であるとき、順列 \{a_1, ..., a_{j-1}, a_j, a_{j+1}, ..., a_N\} を \{a_{j+1}, ..., a_N, a_j, a_1, ..., a_{j-1}\} に変更する。

なお、順列 L, R は空になることもあり得る。例えば L が空の時は、q_i \ \ R を R \ \ q_i に変更する。R が空のときについても同様である。

与えられた順列に対してこれら Q 個のクエリを順に処理した後の順列を一行に出力せよ。

入力形式

N Q
a_1 a_2 ... a_N
q_1 q_2 ... q_Q

入力は全て整数である。

一行目には順列の要素数 N とクエリの回数 Q が空白区切りで与えられる。
二行目には 1 から N までの整数を並び変えた順列 a_1, a_2, ..., a_N が空白区切りで与えられる。
三行目にはクエリが Q 個、空白区切りで与えられる。q_i は i 番目のクエリを表す。

制約

1 \leq N \leq 10^5

1 \leq Q \leq 10^5

1 \leq a_i \leq N

a_i は相異なる

1 \leq q_i \leq N

出力形式

クエリを順にすべて処理した後の順列を一行に出力せよ。

入力例1

5 2
1 5 3 2 4
5 2

出力例1

4 5 1 2 3

1番目のクエリにより、順列は \{3, 2, 4, 5, 1\} へ変わる。

2番目のクエリにより、順列は \{4, 5, 1, 2, 3\} へ変わる。

入力例2

5 1
1 2 3 4 5
5

出力例2

5 1 2 3 4

Solution in Scala (judge verdict: Accepted)


object Main extends App {

  import scala.io.StdIn._

  val Array(n, q) = readLine.trim.split(' ').map(_.toInt)
  var nums= readLine.trim.split(' ').map(_.toInt).map{value ⇒ new BiList(value, None, None)}.let{a ⇒
    for (i ← 1 until a.length){
      a(i - 1).next = Some(a(i))
      a(i).prev = Some(a(i - 1))
    }
    a
  }
  val holder = new ListHolder(nums.head, nums.last)
  nums = nums.sortBy(_.value)
  val queries = readLine.trim.split(' ').map(_.toInt - 1)
  for (query <- queries){
    holder.swapAt(nums(query))
  }
  println(
    holder.toList.map(_.toString).mkString(" ")
  )
  class ListHolder(var first: BiList, var last: BiList) {
    def swapAt(q: BiList): Unit = {
      (q.prev, q.next) match {
        case (Some(leftLast), Some(rightFirst)) ⇒
          q.next = Some(first)
          first.prev = Some(q)
          q.prev = Some(last)
          last.next = Some(q)
          first = rightFirst
          last = leftLast
          first.prev = None
          last.next = None
        case (None, Some(rightFirst)) ⇒
          q.prev = Some(last)
          last.next = Some(q)
          first = rightFirst
          last = q
          first.prev = None
          last.next = None
        case (Some(leftLast), None) ⇒
          q.next = Some(first)
          first.prev = Some(q)
          first = q
          last = leftLast
          first.prev = None
          last.next = None
        case (None, None) ⇒
      }

    }
    def toList: List[Int] = {
      var l = last
      var res: List[Int] = l.value::Nil
      while (first != l){
        l = l.prev.get
        res ::= l.value
      }
      res
    }
  }
  class BiList(val value: Int, var prev: Option[BiList], var next: Option[BiList]) {
    override def toString: String = s"BiList($value, ${prev.map(_.value)}, ${next.map(_.value)})"
  }

  implicit class Extenion[T](val value :T){
    def also(func: T ⇒ Unit): T = {
      func(value)
      value
    }
    def let[R](func: T ⇒ R): R = func(value)
  }
}