#include <bits/stdc++.h>
using namespace std;
struct tree {
  int t[(1 << 18) << 2];
  tree() { memset(t, 0, sizeof(t)); }
  void insert(int x, int v, int l, int r, int i) {
    if (l == r) {
      t[i] += v;
      return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid)
      insert(x, v, l, (l + r) >> 1, i << 1);
    else
      insert(x, v, ((l + r) >> 1) + 1, r, (i << 1) + 1);
    t[i] = t[i << 1] + t[(i << 1) + 1];
  }
  int query(int tl, int tr, int l, int r, int i) {
    if (tl > r || tr < l) return 0;
    if (tl <= l && r <= tr) return t[i];
    return query(tl, tr, l, (l + r) >> 1, i << 1) +
           query(tl, tr, ((l + r) >> 1) + 1, r, (i << 1) + 1);
  }
  int get(int k, int l, int r, int i) {
    if (l == r) return l;
    if (k <= t[i << 1])
      return get(k, l, (l + r) >> 1, i << 1);
    else
      return get(k - t[i << 1], ((l + r) >> 1) + 1, r, (i << 1) + 1);
  }
} f, g;
int c, n, a[(1 << 18)], b[(1 << 18)], pos[(1 << 18)], d[(1 << 18)];
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) scanf("%d", a + i), pos[a[i]] = i;
  for (int i = 0; i < n; i++) scanf("%d", b + i);
  for (int i = n - 1; i >= 0; i--) {
    int x = g.query(0, b[i], 0, n - 1, 1);
    int y = f.query(0, a[i], 0, n - 1, 1);
    d[i] = x + y + c;
    if (d[i] >= n - i)
      d[i] -= (n - i), c = 1;
    else
      c = 0;
    g.insert(b[i], 1, 0, n - 1, 1);
    f.insert(a[i], 1, 0, n - 1, 1);
  }
  for (int i = 0; i < n; i++) {
    a[i] = f.get(d[i] + 1, 0, n - 1, 1);
    f.insert(a[i], -1, 0, n - 1, 1);
  }
  for (int i = 0; i < n; i++) printf("%d ", a[i]);
  return 0;
}
