#include <bits/stdc++.h>
using namespace std;
class max_seg_tree {
  vector<long long> V;
  vector<long long> lazy;
  long long N, n;
  void update(long long idx, long long val) {
    V[idx] += val;
    lazy[idx] += val;
  }
  void push(long long idx) {
    if (lazy[idx]) {
      update(2 * idx + 1, lazy[idx]);
      update(2 * idx + 2, lazy[idx]);
    }
    lazy[idx] = 0;
  }
  void update(long long idx, long long i, long long j, long long x, long long y,
              long long k) {
    if (j < x || i > y) {
      return;
    }
    if (i >= x && j <= y) {
      update(idx, k);
      return;
    }
    push(idx);
    long long mid = (i + j) / 2;
    update(2 * idx + 1, i, mid, x, y, k);
    update(2 * idx + 2, mid + 1, j, x, y, k);
    V[idx] = min(V[2 * idx + 1], V[2 * idx + 2]);
  }
  long long query(long long idx, long long i, long long j, long long x,
                  long long y) {
    if (j < x || i > y) {
      return 0;
    }
    if (i >= x && j <= y) {
      return V[idx];
    }
    push(idx);
    long long mid = (i + j) / 2;
    long long val1 = query(2 * idx + 1, i, mid, x, y);
    long long val2 = query(2 * idx + 2, mid + 1, j, x, y);
    return min(val1, val2);
  }
  void print_tree(long long idx, long long x, long long y) {
    printf("%lld : {%lld, %lld} : {%lld, %lld}\n", idx, x, y, V[idx],
           lazy[idx]);
    if (x < y) {
      long long mid = (x + y) / 2;
      print_tree(2 * idx + 1, x, mid);
      print_tree(2 * idx + 2, mid + 1, y);
    }
  }

 public:
  max_seg_tree(long long n1) {
    n = n1;
    long long log_n = ceil(log2(n));
    long long N = 2 * pow(2, log_n) - 1;
    V.resize(N, 0);
    lazy.resize(N, 0);
  }
  void update(long long x, long long y, long long k) {
    update(0, 0, n - 1, x, y, k);
  }
  long long query(long long x, long long y) { return query(0, 0, n - 1, x, y); }
  void print_tree() {
    printf("----seg tree----\n");
    print_tree(0, 0, n - 1);
    printf("----------------\n");
  }
  virtual ~max_seg_tree() {}
};
int main() {
  long long n, x;
  cin >> n;
  vector<long long> Q(n), A(n), P(n);
  for (long long i = 0; i < n; ++i) {
    cin >> A[i];
    --A[i];
    P[A[i]] = i;
  }
  max_seg_tree T(n);
  for (long long i = 0; i < n; ++i) {
    cin >> Q[i];
    --Q[i];
  }
  long long curr_max = n;
  cout << curr_max << " ";
  for (long long i = 0; i < n - 1; ++i) {
    T.update(0, Q[i], 1);
    while (1) {
      T.update(0, P[curr_max - 1], -1);
      long long val = T.query(0, n - 1);
      if (val >= 0) {
        curr_max--;
      } else {
        T.update(0, P[curr_max - 1], 1);
        break;
      }
    }
    cout << curr_max << " ";
  }
  cout << endl;
  return 0;
}
