#include <bits/stdc++.h>
using namespace std;
struct node_t {
  int lo, hi;
  int64_t sum, maxn, add_tag;
  void add(int tag) {
    sum += (hi - lo) * tag;
    maxn += tag;
    add_tag += tag;
  }
  void maintain(node_t &lhs, node_t &rhs) {
    sum = lhs.sum + rhs.sum;
    maxn = max(lhs.maxn, rhs.maxn);
  }
  void pushdown(node_t &lhs, node_t &rhs) {
    if (add_tag == 0) return;
    lhs.add(add_tag);
    rhs.add(add_tag);
    add_tag = 0;
  }
};
struct seg_t {
  vector<node_t> seg;
  seg_t(int sz) : seg(2 * sz) {
    int n = sz, k = 1 << (31 - __builtin_clz(2 * n - 1));
    int m = n + n - k, s = k - n;
    for (int i = 0; i < m; ++i) seg[i + k] = node_t{i, i + 1, 0, 0, 0};
    for (int i = m; i < n; ++i) seg[i + s] = node_t{i, i + 1, 0, 0, 0};
    for (int i = n - 1; i; --i)
      seg[i] = node_t{seg[i + i].lo, seg[i + i + 1].hi, 0, 0, 0};
  }
  template <class Fun>
  void update(int l, int r, Fun fun, int i = 1) {
    if (l >= seg[i].hi || r <= seg[i].lo) return;
    if (l <= seg[i].lo && r >= seg[i].hi) return fun(seg[i]);
    seg[i].pushdown(seg[i + i], seg[i + i + 1]);
    update(l, r, fun, i + i);
    update(l, r, fun, i + i + 1);
    seg[i].maintain(seg[i + i], seg[i + i + 1]);
  }
  template <class Fun>
  void query(int l, int r, Fun fun, int i = 1) {
    if (l >= seg[i].hi || r <= seg[i].lo) return;
    if (l <= seg[i].lo && r >= seg[i].hi) return fun(seg[i]);
    seg[i].pushdown(seg[i + i], seg[i + i + 1]);
    query(l, r, fun, i + i);
    query(l, r, fun, i + i + 1);
  }
  void add(int l, int r, int val) {
    update(l, r, [&](node_t &a) { a.add(val); });
  }
  int64_t get_max(int l, int r) {
    int64_t res = INT_MIN;
    query(l, r, [&](node_t &a) { res = max(res, a.maxn); });
    return res;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n;
  cin >> n;
  vector<int> p(n), pos(n), q(n);
  for (int i = 0; i < n; ++i) {
    cin >> p[i];
    pos[--p[i]] = i;
  }
  for (auto &e : q) cin >> e, --e;
  int ans = n - 1;
  cout << ans + 1;
  seg_t seg(n);
  seg.add(0, pos[ans] + 1, 1);
  for (int i = 0; i < n - 1; ++i) {
    seg.add(0, q[i] + 1, -1);
    while (true) {
      int maxn = seg.get_max(0, n);
      if (maxn <= 0)
        seg.add(0, pos[--ans] + 1, 1);
      else
        break;
    }
    cout << ' ' << ans + 1;
  }
  return 0;
}
