#include <bits/stdc++.h>
using namespace std;
const int len = 1 << 18;
struct BIT {
  vector<int> data;
  BIT() : data(len, 0) {}
  void update(int i, int value) {
    for (; i < len; i |= i + 1) data[i] += value;
  }
  int query(int i) {
    if (i < 0) return 0;
    int s = 0;
    for (; i >= 0; i = (i & i + 1) - 1) s += data[i];
    return s;
  }
};
int N;
vector<int> ord(vector<int> v) {
  vector<int> res(N);
  BIT bit;
  for (int i = 0; i < (int)(N); i++) bit.update(i, 1);
  for (int i = 0; i < (int)(N); i++) {
    bit.update(v[i], -1);
    res[i] = bit.query(v[i]);
  }
  return res;
}
int main() {
  scanf("%d", &N);
  vector<int> a(N), b(N);
  for (int i = 0; i < (int)(N); i++) scanf("%d", &a[i]);
  for (int i = 0; i < (int)(N); i++) scanf("%d", &b[i]);
  vector<int> va = ord(a), vb = ord(b);
  vector<int> v(N), res(N);
  for (int i = 0; i < (int)(N); i++) {
    int j = N - i - 1;
    v[j] += va[j] + vb[j];
    if (j > 0) v[j - 1] += v[j] / (i + 1);
    v[j] %= i + 1;
  }
  BIT bit;
  for (int i = 0; i < (int)(N); i++) bit.update(i, 1);
  bit.update(0, -1);
  for (int i = 0; i < (int)(N); i++) {
    int li = -1, la = N;
    while (la - li > 1) {
      int mid = (li + la) / 2;
      int s = bit.query(mid);
      if (s < v[i])
        li = mid;
      else
        la = mid;
    }
    bit.update(la, -1);
    res[i] = la;
  }
  for (int i = 0; i < (int)(N); i++) {
    if (i > 0) printf(" ");
    printf("%d", res[i]);
  }
  printf("\n");
  return 0;
}
