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



Sample input:
5 2
1 5 3 2 4
5 2


Sample output:
4 5 1 2 3

Submission status: Accepted

Solution code:
# -*- coding: utf-8 -*-
def inpl(): return list(map(int, input().split()))
N, _ = inpl()
A = inpl()

if N == 1:
    print(*A)
    exit()

L = [0]*(N+1)
R = [0]*(N+1)

for i in range(N-1):
    R[A[i]] = A[i+1]
    L[A[i+1]] = A[i]

lm = A[0]
rm = A[-1]

for q in inpl():
    if q == rm:
        l = L[q]
        
        R[l] = 0
        L[q] = 0
        R[q] = lm
        L[lm] = q

        lm = q
        rm = l

    elif q == lm:
        r = R[q]
        L[r] = 0
        R[q] = 0
        L[q] = rm
        R[rm] = q
        lm = r
        rm = q

    else:
        l, r = L[q], R[q]
        L[q] = rm
        R[q] = lm
        
        R[l] = 0
        L[r] = 0
        
        L[lm] = q
        R[rm] = q
        
        rm = l
        lm = r

ans = []
while lm != 0:
    ans.append(lm)
    lm = R[lm]

print(*ans)