#include <bits/stdc++.h>
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  std::cerr << name << " : " << arg1 << '\n';
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  std::cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
using namespace std;
const int N = 300001;
struct T {
  int v, p;
  T operator+(const T& a) const {
    if (v < a.v) return *this;
    if (v > a.v) return a;
    return {v, max(p, a.p)};
  }
};
const T zero = {1000000000, 0};
struct S {
  T st[N << 2];
  int lz[N << 2];
  void build(int node, int i, int j) {
    if (i == j) {
      st[node] = {0, i};
      return;
    }
    int mid = i + j >> 1;
    build(node << 1, i, mid);
    build(node << 1 | 1, mid + 1, j);
    st[node] = st[node << 1] + st[node << 1 | 1];
  }
  void update(int node, int i, int j, int l, int r, int v) {
    if (lz[node]) {
      st[node].v += lz[node];
      if (i != j) {
        lz[node << 1] += lz[node];
        lz[node << 1 | 1] += lz[node];
      }
      lz[node] = 0;
    }
    if (i > r or j < l or r < l) return;
    if (i >= l and j <= r) {
      st[node].v += v;
      if (i != j) {
        lz[node << 1] += v;
        lz[node << 1 | 1] += v;
      }
      return;
    }
    int mid = i + j >> 1;
    update(node << 1, i, mid, l, r, v);
    update(node << 1 | 1, mid + 1, j, l, r, v);
    st[node] = st[node << 1] + st[node << 1 | 1];
  }
  T query(int node, int i, int j, int l, int r) {
    if (lz[node]) {
      st[node].v += lz[node];
      if (i != j) {
        lz[node << 1] += lz[node];
        lz[node << 1 | 1] += lz[node];
      }
      lz[node] = 0;
    }
    if (i > r or j < l or r < l) return zero;
    if (i >= l and j <= r) return st[node];
    int mid = i + j >> 1;
    return query(node << 1, i, mid, l, r) +
           query(node << 1 | 1, mid + 1, j, l, r);
  }
} s;
int st[N << 2];
int p[N], q[N], m[N];
int ans[N + 1];
void build(int node, int i, int j) {
  if (i == j) {
    st[node] = p[i];
    return;
  }
  int mid = i + j >> 1;
  build(node << 1, i, mid);
  build(node << 1 | 1, mid + 1, j);
  st[node] = min(st[node << 1], st[node << 1 | 1]);
}
void update(int node, int i, int j, int p, int v) {
  if (i == j) {
    st[node] = v;
    return;
  }
  int mid = i + j >> 1;
  if (p <= mid)
    update(node << 1, i, mid, p, v);
  else
    update(node << 1 | 1, mid + 1, j, p, v);
  st[node] = min(st[node << 1], st[node << 1 | 1]);
}
int query(int node, int i, int j, int l, int r) {
  if (i > r or j < l) return 1000000000;
  if (i >= l and j <= r) return st[node];
  int mid = i + j >> 1;
  return min(query(node << 1, i, mid, l, r),
             query(node << 1 | 1, mid + 1, j, l, r));
}
int main() {
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> p[i];
    m[p[i]] = i;
  }
  for (int i = 1; i <= n; i++) cin >> q[i];
  build(1, 1, n);
  s.build(1, 1, n);
  for (int i = n; i; i--) {
    T t = s.query(1, 1, n, 1, q[i] - 1);
    int l = (t.v == 0 ? t.p + 1 : 1);
    int x = query(1, 1, n, l, n);
    int r = m[x];
    ans[i] = max(ans[i + 1], x);
    update(1, 1, n, r, 1000000000);
    s.update(1, 1, n, q[i], n, 1);
    s.update(1, 1, n, r, n, -1);
  }
  for (int i = 1; i <= n; i++) cout << ans[i] << ' ';
  cout << endl;
  return 0;
}
