#include <bits/stdc++.h>
using namespace std;
const int maxn = int(2e5) + 100;
int bit[maxn];
int it[maxn * 4];
int a[maxn], b[maxn], sa[maxn], sb[maxn], x[maxn];
void updatebit(int x, int val, int n) {
  while (x <= n) {
    bit[x] += val;
    x += x & (-x);
  }
}
int get(int x) {
  if (x == 0) return 0;
  return bit[x] + get(x & (x - 1));
}
void create(int a[], int sa[], int n) {
  fill(bit, bit + n + 1, 0);
  for (int i = 1; i <= n; i++) updatebit(i, 1, n);
  for (int i = 0; i <= n - 1; i++) {
    sa[i] = get(a[i]);
    updatebit(a[i] + 1, -1, n);
  }
}
void initial_tree(int l, int r, int k) {
  if (l == r) {
    it[k] = 1;
    return;
  }
  int mid = (l + r) / 2;
  initial_tree(l, mid, k * 2);
  initial_tree(mid + 1, r, k * 2 + 1);
  it[k] = it[k * 2] + it[k * 2 + 1];
}
void update(int x, int l, int r, int k) {
  if (r < x || l > x) return;
  if (l == r) {
    it[k]--;
    return;
  }
  int mid = (l + r) / 2;
  update(x, l, mid, k * 2);
  update(x, mid + 1, r, k * 2 + 1);
  it[k] = it[k * 2] + it[k * 2 + 1];
}
int getit(int val, int l, int r, int k) {
  if (l == r) return r;
  int mid = (l + r) / 2;
  if (it[k * 2] < val) return getit(val - it[k * 2], mid + 1, r, k * 2 + 1);
  return getit(val, l, mid, k * 2);
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i <= n - 1; i++) cin >> a[i];
  for (int i = 0; i <= n - 1; i++) cin >> b[i];
  create(a, sa, n);
  create(b, sb, n);
  int nho = 0;
  for (int i = n - 2; i >= 0; i--) {
    int val = sa[i] + sb[i] + nho;
    x[i] = val % (n - i);
    nho = val / (n - i);
  }
  initial_tree(1, n, 1);
  for (int i = 0; i <= n - 1; i++) {
    int v = getit(x[i] + 1, 1, n, 1) - 1;
    update(v + 1, 1, n, 1);
    cout << v << ' ';
  }
}
