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 C (judge verdict: Accepted)

#include <stdio.h>
int pre[100010],nex[100010];

int main(){
	int n,q;
	scanf("%d%d",&n,&q);
	int b=0;
	for(int i=0;i<n;i++){
		int t;
		scanf("%d",&t);
		nex[b]=t;
		pre[t]=b;
		b=t;
	}
	nex[b]=n+1;
	pre[n+1]=b;
	
	while(q--){
		int x;
		scanf("%d",&x);
		if(pre[x]==0){
			nex[0]=nex[x];
			pre[nex[x]]=0;
			nex[x]=n+1;
			pre[x]=pre[n+1];
			nex[pre[n+1]]=x;
			pre[n+1]=x;
		}else if(nex[x]==n+1){
			pre[n+1]=pre[x];
			nex[pre[x]]=n+1;
			pre[x]=0;
			nex[x]=nex[0];
			pre[nex[0]]=x;
			nex[0]=x;
		}else{
			int aaa=pre[x];
			pre[x]=pre[n+1];
			nex[pre[n+1]]=x;
			pre[n+1]=aaa;
			nex[aaa]=n+1;
			int bbb=nex[x];
			nex[x]=nex[0];
			pre[nex[0]]=x;
			nex[0]=bbb;
			pre[bbb]=0;
		}
	}
	int pos=0;
	for(int i=0;i<n;i++)printf("%d%c",pos=nex[pos],i==n-1?10:32);
}