func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 200200;   int n;   int a[maxn], b[maxn], c[3][maxn];   int sum[maxn];   int lowbit(int x) { return x & (-x); }   void add(int p, int v = 1) {     for (int i = p; i <= n; i += lowbit(i)) sum[i] += v;   }   int get(int p) {     int ret = 0;     for (int i = p; i; i -= lowbit(i)) ret += sum[i];     return ret;   }   bool on[maxn];   int main() {     scanf( %d , &n);     for (int i = 0; i < n; i++) {       scanf( %d , a + i);       a[i]++;       int before = get(a[i]);       c[0][i] = a[i] - 1 - before;       add(a[i]);     }     memset(sum, 0, sizeof(sum));     for (int i = 0; i < n; i++) {       scanf( %d , b + i);       b[i]++;       int before = get(b[i]);       c[1][i] = b[i] - 1 - before;       c[2][i] = c[0][i] + c[1][i];       add(b[i]);     }     for (int i = n - 1; i > 0; i--) {       int j = n - 1 - i;       if (c[2][i] > j) {         c[2][i] -= j + 1;         c[2][i - 1]++;       }     }     c[2][0] %= n;     memset(sum, 0, sizeof(sum));     memset(on, true, sizeof(on));     for (int i = 1; i <= n; i++) add(i);     vector<int> vi;     for (int i = 0; i < n; i++) {       int goal = c[2][i];       int low = 0, high = n, ans = -1;       while (low <= high) {         int mid = (low + high) / 2;         int s = get(mid);         if (s == goal) {           if (on[mid + 1] == true) {             ans = mid + 1;             break;           } else             low = mid + 1;         } else if (s < goal)           low = mid + 1;         else if (s > goal)           high = mid - 1;       }       on[ans] = false;       add(ans, -1);       vi.push_back(ans - 1);     }     for (int i = 0; i < n; i++) printf( %d  , vi[i]);     putchar(10);     return 0;   }   