func_code_string: #include <bits/stdc++.h>   using namespace std;   const long double pi = 3.14159265359;   template <typename T>   T abs(T x) {     return x > 0 ? x : -x;   }   template <typename T>   T sqr(T x) {     return x * x;   }   long long gcd(long long a, long long b) { return a ? gcd(b % a, a) : b; }   const int maxn = 2e5 + 5;   const int inf = 1e9;   int nxt[maxn];   int len[maxn];   int dp[maxn];   int ff[maxn];   int main() {     srand(time(NULL));     int n;     scanf( %d , &n);     vector<int> cc;     cc.push_back(0);     vector<int> a;     for (int i = 0; i < n; i++) {       int x;       scanf( %d , &x);       x++;       a.push_back(x);       cc.push_back(x);     }     int k;     scanf( %d , &k);     vector<int> b;     for (int i = 0; i < k; i++) {       int x;       scanf( %d , &x);       x++;       b.push_back(x);       cc.push_back(x);     }     sort(cc.begin(), cc.end());     cc.resize(unique(cc.begin(), cc.end()) - cc.begin());     for (int &x : a) {       if (x != 0) {         x = lower_bound(cc.begin(), cc.end(), x) - cc.begin();       }     }     multiset<int> bs;     for (int &x : b) {       x = lower_bound(cc.begin(), cc.end(), x) - cc.begin();       bs.insert(x);     }     sort(b.begin(), b.end());     int p = 0;     for (int i = 0; i < maxn; i++) {       while (p < k && i == b[p]) {         p++;       }       nxt[i] = p < k ? b[p] : -1;     }     fill(len, len + maxn, inf);     len[0] = 0;     for (int i = 0; i < n; i++) {       if (a[i] != 0) {         int lo = -1, hi = maxn;         while (hi - lo > 1) {           int mid = (lo + hi) >> 1;           if (len[mid] < a[i]) {             lo = mid;           } else {             hi = mid;           }         }         dp[i] = lo + 1;         ff[i] = a[i];         if (len[lo + 1] > a[i]) {           len[lo + 1] = a[i];         }       } else {         for (int j = n - 1; j >= 0; j--) {           if (len[j] == inf) {             continue;           }           int x = nxt[len[j]];           if (x != -1) {             if (dp[i] < j + 1) {               dp[i] = j + 1;               ff[i] = x;             }           }           if (x != -1 && len[j + 1] > x) {             len[j + 1] = x;           }         }       }     }     int clen = *max_element(dp, dp + n);     int ub = 1e9;     int pos = n;     p = k - 1;     vector<vector<int>> d(maxn);     for (int i = 0; i < n; i++) {       if (a[i]) {         d[dp[i]].push_back(i);       }     }     for (int i = clen; i >= 1; i--) {       bool found = false;       for (int x : d[i]) {         if (x < pos && a[x] < ub) {           ub = a[x];           pos = x;           found = true;           break;         }       }       if (found) {         continue;       }       for (int j = pos - 1; j >= 0; j--) {         if (a[j] == 0 && dp[j] >= i) {           while (p >= 0 && b[p] >= ub) {             p--;           }           assert(p >= 0);           a[j] = b[p];           bs.erase(bs.find(a[j]));           ub = a[j];           pos = j;           p--;           break;         }       }     }     for (int i = 0; i < n; i++) {       if (a[i] == 0) {         assert(bs.size());         a[i] = *bs.begin();         bs.erase(bs.begin());       }     }     for (int i = 0; i < n; i++) {       if (i) {         printf(   );       }       printf( %d , cc[a[i]] - 1);     }     return 0;   }   