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 <bits/stdc++.h>

using namespace std;

using int64 = long long;


int main() {
  int N, Q;
  cin >> N >> Q;
  vector< int > A(N);
  const int SQ = 333;
  for(int i = 0; i < N; i++) {
    cin >> A[i];
    --A[i];
  }
  vector< int > pending;
  for(int i = 0; i < Q; i++) {
    int q;
    cin >> q;
    --q;
    pending.emplace_back(q);
    if(i % SQ == SQ - 1 || i + 1 == Q) {

      vector< int > used(N);
      for(auto &p : pending) used[p] = true;
      vector< int > type(N);

      int ptr = -1;
      bool prev = true;
      for(int j = 0; j < N; j++) {
        if(used[A[j]]) {
          ++ptr;
          prev = true;
        } else if(prev) {
          ++ptr;
          prev = false;
        }
        type[A[j]] = ptr;
      }
      ++ptr;
      vector< vector< int > > lis(ptr);
      for(int j = 0; j < N; j++) {
        lis[type[A[j]]].emplace_back(A[j]);
      }
      
      vector< int > now(ptr);
      iota(begin(now), end(now), 0);

      for(auto &p : pending) {
        vector< int > nxt(ptr);
        for(int j = 0; j < ptr; j++) {
          if(now[j] == type[p]) {

            int uku = 0;
            for(int k = j + 1; k < ptr; k++) {
              nxt[uku++] = now[k];
            }
            nxt[uku++] = now[j];
            for(int k = 0; k < j; k++) {
              nxt[uku++] = now[k];
            }
            now = nxt;
            break;
          }
        }
      }

      vector< int > B(N);
      int uku = 0;
      for(int j = 0; j < ptr; j++) {
        for(auto &k : lis[now[j]]) B[uku++] = k;
      }
      A = B;
      pending.clear();
    }
  }


  for(int i = 0; i < N; i++) {
    if(i > 0) cout << " ";
    cout << A[i] + 1;
  }
  cout << endl;

}