#include <iostream>
#include <vector>

using namespace std;


class node
{
public:
	node()
	{
		id =0;
		Lchild = nullptr;
		Mchild = nullptr;
		Rchild = nullptr;
	}
	node(int id)
	{
		this->id = id;
		Lchild = nullptr;
		Mchild = nullptr;
		Rchild = nullptr;
	}
	int id;
	node* Lchild;
	node* Mchild;
	node* Rchild;
};

node* build(vector<int> preOrder, vector<int> inOrder, int start, int end);
void findIndex(int id, vector<int> inOrder, int strat, int end, int &pos1, int &pos2);
void postOrder(node* root);


int main()
{
	ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int n;
	cin >> n;
	vector<int> preOrder, inOrder;
	preOrder.resize(n);
	inOrder.resize(n * 2);
	for (int i = 0;i < n;i++)
	{
		int num;
		cin >> num;
		preOrder[i] = num;
	}
	for (int i = 0;i < n * 2;i++)
	{
		int num;
		cin >> num;
		inOrder[i] = num;
	}

	node* root = build(preOrder, inOrder, 0, n * 2 - 1);
	postOrder(root);

	system("pause");
	return 0;
}

node* build(vector<int> preOrder, vector<int> inOrder, int start, int end)
{
	static int preOrder_index = 0;
	if (preOrder_index == preOrder.size())
		return nullptr;

	if (start >= end)
		return nullptr;

	node* r = new node(preOrder[preOrder_index]);
	preOrder_index++;
	if (start == end - 1)
		return r;

	int pos1 = -1, pos2 = -1;
	findIndex(r->id, inOrder, start, end, pos1, pos2);

	r->Lchild = build(preOrder, inOrder, start, pos1 - 1);
	r->Mchild = build(preOrder, inOrder, pos1 + 1, pos2 - 1);
	r->Rchild = build(preOrder, inOrder, pos2 + 1, end);

	return r;
}

void findIndex(int id, vector<int> inOrder, int start, int end, int &pos1, int &pos2)
{
	for (int i = start;i <= end;i++)
	{
		if (id == inOrder[i])
		{
			if (pos1 == -1)
			{
				pos1 = i;
				continue;
			}
			else
			{
				pos2 = i;
				break;
			}
		}
	}
}

void postOrder(node* root)
{
	if (root != nullptr)
	{
		postOrder(root->Lchild);
		postOrder(root->Mchild);
		postOrder(root->Rchild);
		cout << root->id << " ";

	}
}