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 <algorithm>
#include <iostream>
#include <vector>
using namespace std;

template<typename T>
struct List {
    struct Node {
        Node *prev, *next;
        T data;
        Node(Node* prev = nullptr, Node* next = nullptr, T data = T())
        : prev(prev), next(next), data(data) { }
    };
    Node *head, *tail;
    List() : head(new Node()), tail(new Node()) {
        head->next = tail, tail->prev = head;
    }
    Node* begin() { return head->next; }
    Node* end() { return tail; }
    Node* insert(Node* cur, T data) {
        cur = new Node(cur->prev, cur, data);
        return cur->prev->next = cur->next->prev = cur;
    }
    Node* push_front(T data) { return insert(begin(), data); }
    Node* push_back(T data) { return insert(end(), data); }
    Node* erase(Node* cur) {
        if (cur == head || cur == tail) return cur;
        cur->prev->next = cur->next, cur->next->prev = cur->prev;
        Node* tmp = cur->next;
        return free(cur), tmp;
    }
    Node* pop_front() { return erase(begin()); }
    Node* pop_back() { return erase(end()->prev); }
    Node* find(T data) {
        Node* cur = begin();
        while (cur != end() && cur->data != data) cur = cur->next;
        return cur;
    }
    friend ostream& operator<<(ostream& os, List& li) {
        Node* cur = li.begin();
        for (int cnt = 0; cur != li.end(); cur = cur->next) {
            if (cnt++) os << " "; os << cur->data;
        }
        return os;
    }
    Node* swap_by_pivot(Node* cur) {
        if (cur->prev == head && cur->next != tail) {
            cur->next->prev = head;
            tail->prev->next = cur;
            head->next = cur->next;
            cur->prev = tail->prev;
            cur->next = tail;
            tail->prev = cur;
            return cur;
        }
        if (cur->prev != head && cur->next == tail) {
            cur->prev->next = tail;
            head->next->prev = cur;
            tail->prev = cur->prev;
            cur->next = head->next;
            cur->prev = head;
            head->next = cur;
            return cur;
        }
        if (cur->prev != head && cur->next != tail) {
            cur->prev->next = tail;
            cur->next->prev = head;
            tail->prev->next = cur;
            head->next->prev = cur;
            swap(tail->prev, cur->prev);
            swap(head->next, cur->next);
            return cur;
        }
        return cur;
    }
};

int main() {
    List<int> li;
    int n, q; cin >> n >> q;
    vector<List<int>::Node*> pos(n + 1);
    for (int i = 0; i < n; i++) {
        int a; cin >> a;
        pos[a] = li.push_back(a);
    }
    while (q--) {
        int x; cin >> x;
        li.swap_by_pivot(pos[x]);
    }
    cout << li << endl;
	return 0;
}