func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize(2)   using namespace std;   const int INF = 0x3f3f3f3f;   const int maxn = 100010;   inline int read() {     int x = 0, f = 1;     char ch = 0;     while (!isdigit(ch)) {       ch = getchar();       if (ch ==  - ) f = -1;     }     while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();     return x * f;   }   int n, m;   int a[maxn], b[maxn], low[maxn], pre[maxn], f[maxn], la[maxn];   int gap[maxn];   void work() {     memset(low, 63, sizeof(low));     pre[1] = low[1] = 0, f[1] = la[1] = 1;     for (int k = 2; k <= n; ++k) {       if (a[k] + 1) {         int L = 1, R = n;         while (L <= R) {           int mid = (L + R) >> 1;           if (low[mid] < a[k])             L = mid + 1;           else             R = mid - 1;         }         pre[k] = la[L - 1];         la[L] = k;         f[k] = L, low[L] = a[k];       } else {         pre[k] = -1, f[k] = -1;         int j = n;         for (int i = m; i >= 1; i--) {           while (low[j] >= b[i]) j--;           low[j + 1] = b[i], la[j + 1] = -1;         }       }     }   }   void work2() {     int L, R, rem = m;     int x = n;     while (x)       if (a[x] + 1) {         if (pre[x] >= 0) {           x = pre[x];           continue;         }         R = lower_bound(b + 1, b + rem + 1, a[x]) - b - 1;         for (int y = x - 1; y != 0; y--) {           if (a[y] == -1 || a[y] >= a[x]) continue;           L = upper_bound(b + 1, b + rem + 1, a[y]) - b;           if (f[x] - f[y] - 1 == min(R - L + 1, gap[x] - gap[y])) {             for (int i = y, j = L; i <= x && j <= R; i++)               if (a[i] == -1) a[i] = b[j], b[j] = -1, j++;             x = y;             rem = L - 1;             break;           }         }       }     for (int i = 1, j = 1; i <= n; ++i) {       if (a[i] + 1) continue;       while (b[j] == -1) ++j;       a[i] = b[j];       b[j++] = -1;     }   }   int main() {     n = read();     a[1] = 0;     a[n + 2] = INF;     for (int i = 2; i <= n + 1; ++i)       a[i] = read(), gap[i] = gap[i - 1] + (a[i] == -1);     m = read();     gap[n + 2] = gap[n + 1];     n += 2;     for (int i = 1; i <= m; ++i) b[i] = read();     sort(b + 1, b + m + 1);     m = unique(b + 1, b + m + 1) - b - 1;     work();     work2();     for (int i = 2; i < n; ++i) printf( %d  , a[i]);   }   