#include <bits/stdc++.h>
using namespace std;
const int Maxn = 1 << 20;
int p[Maxn], q[Maxn], cnt[Maxn], n;
struct Ordered_Set {
  vector<int> Fen;
  void resize(int x = Maxn) { Fen.resize(x + 10); }
  void clear() {
    for (int i = 0; i < Fen.size(); i++) Fen[i] = 0;
  }
  void insert(int x) {
    for (++x; x < Fen.size(); x += x & -x) Fen[x]++;
  }
  void erase(int x) {
    for (++x; x < Fen.size(); x += x & -x) Fen[x]--;
  }
  int less(int x) {
    int res = 0;
    for (; x; x ^= x & -x) res += Fen[x];
    return res;
  }
  int value(int k) {
    k--;
    int l = 0;
    for (int i = 19; ~i; i--)
      if ((l | (1 << i)) < Fen.size() && Fen[l | (1 << i)] <= k)
        k -= Fen[l |= (1 << i)];
    return l;
  }
  int count(int x) { return (less(x + 1) - less(x)); }
  int lower_bound(int x) { return value(less(x) + 1); }
  int upper_bound(int x) { return value(less(x + 1) + 1); }
  bool find(int x) { return count(x); }
  int begin() { return value(1); }
  int end() { return upper_bound(Maxn); }
  int size() { return Fen.size(); }
} P, Q, S;
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  P.resize();
  Q.resize();
  S.resize();
  for (int i = 0; i < n; i++) {
    P.insert(i);
    Q.insert(i);
    S.insert(i);
  }
  for (int i = 0; i < n; i++) {
    cin >> q[i];
    Q.erase(q[i]);
    cnt[n - i - 1] += Q.less(q[i]);
  }
  for (int i = 0; i < n; i++) {
    cin >> p[i];
    P.erase(p[i]);
    cnt[n - i - 1] += P.less(p[i]);
  }
  for (int i = 0; i < n; i++) {
    cnt[i + 1] += (cnt[i] / (i + 1));
    cnt[i] %= (i + 1);
  }
  for (int i = n - 1; i >= 0; i--) {
    int res = S.value(cnt[i] + 1);
    S.erase(res);
    cout << res << ' ';
  }
  return (0);
}
