Problem: B: Pivots

problem

Given a permutation of length N, a_1, a_2, ..., a_N, which is a permutation of integers from 1 to N. Also, Q queries are given in order for this permutation. In the i-th query, you have to do the following:

* The value q_i (1 \ leq q_i \ leq N) is given. In the permutation \\ {a_1, a_2, ..., a_N \\}, where L is the permutation on the left side of q_i and R is the permutation on the right side of q_i, the original permutation L \\ q_i \\ R is R \\ Change to q_i \\ L. That is, when q_ {i} = a_j, the permutations \\ {a_1, ..., a_ {j-1}, a_j, a_ {j + 1}, ..., a_N \\} are \\ { Change to a_ {j + 1}, ..., a_N, a_j, a_1, ..., a_ {j-1} \\}.



The permutations L and R may be empty. For example, if L is empty, change q_i \\ R to R \\ q_i. The same is true when R is empty.

Output the permutation after processing these Q queries in order for the given permutation on one line.

Input format


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


All inputs are integers.

The first row gives the number of elements in the permutation N and the number of queries Q, separated by blanks. In the second line, permutations a_1, a_2, ..., a_N, in which integers from 1 to N are rearranged, are given separated by blanks. The third line gives Q queries, separated by blanks. q_i represents the i-th query.

Constraint

* 1 \ leq N \ leq 10 ^ 5
* 1 \ leq Q \ leq 10 ^ 5
* 1 \ leq a_i \ leq N
* a_i is different
* 1 \ leq q_i \ leq N



Output format

Output the permutation after processing all the queries in order on one line.

Input example 1


5 2
1 5 3 2 4
5 2


Output example 1


4 5 1 2 3

* The first query changes the permutation to \\ {3, 2, 4, 5, 1 \\}.
* The second query changes the permutation to \\ {4, 5, 1, 2, 3 \\}.



Input example 2


5 1
1 2 3 4 5
Five


Output example 2


5 1 2 3 4





Example

Input

5 2
1 5 3 2 4
5 2


Output

4 5 1 2 3

Solution (in CPP):

Solution:
#include<iostream>
#include<vector>
using namespace std;
int n,Q;
struct p{
	int l,r;
	p*next;
};
int main()
{
	cin>>n>>Q;
	vector<int>a(n),id(n);
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		id[--a[i]]=i;
	}
	p*root=(p*)calloc(1, sizeof(struct p));
	root->l=0,root->r=n;
	for(int i=0;i<Q;i++)
	{
		int q;cin>>q;q--;
		p*now=root;
		while(!(now->l<=id[q]&&now->r>id[q]))now=now->next;
		p*End=now;
		while(End->next!=NULL)End=End->next;
		End->next=(p*)calloc(1,sizeof(struct p));
		p*qq=End->next;
		p*r=(p*)calloc(1,sizeof(struct p));
		qq->l=id[q];
		qq->r=id[q]+1;
		r->l=id[q]+1,r->r=now->r;
		now->r=id[q];
		r->next=now->next;
		qq->next=root;
		now->next=NULL;
		root=r;
		if(i%300==299||i==Q-1)
		{
			p*now=root;
			vector<int>an(n);
			int cnt=0;
			while(now!=NULL)
			{
				for(int j=now->l;j<now->r;j++)
				{
					an[cnt++]=a[j];
				}
				now=now->next;
			}
			for(int j=0;j<n;j++)
			{
				id[an[j]]=j;
			}
			a=an;
			root->l=0;
			root->r=n;
			root->next=NULL;
		}
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]+1<<(i==n-1?"\n":" ");
	}
}