#include <bits/stdc++.h>
using namespace std;
int a[100010], b[100010];
int len[100010], lst[100010], minv[100010], pos[100010];
int ans[100010];
struct _ {
  int pos, val, vval;
  bool operator<=(const _ &ob) const {
    if (val != ob.val) return val < ob.val;
    return vval >= ob.vval;
  }
};
struct xxx {
  int pos, val;
  bool operator<(const xxx &ob) const {
    if (val != ob.val) return val < ob.val;
    return pos < ob.pos;
  }
};
multiset<xxx> o[100010];
multiset<int> s;
int main() {
  memset(minv, 63, sizeof(minv));
  minv[0] = 0;
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  int i;
  for (i = 1; i <= n; ++i) cin >> a[i];
  int m;
  cin >> m;
  for (i = 1; i <= m; ++i) cin >> b[i], s.insert(b[i]);
  sort(b + 1, b + 1 + m);
  for (i = 1; i <= n; ++i) {
    if (a[i] == -1) {
      int j;
      int lst = n;
      for (j = m; j >= 1; --j) {
        while (minv[lst] >= b[j]) --lst;
        len[i] = max(len[i], lst + 1);
        if (b[j] < minv[lst + 1]) {
          minv[lst + 1] = b[j];
          pos[lst + 1] = i;
        }
      }
    } else {
      int *p = lower_bound(minv, minv + 100001, a[i]);
      --p;
      len[i] = p - minv + 1;
      lst[i] = pos[p - minv];
      if (a[i] < minv[len[i]]) {
        minv[len[i]] = a[i];
        pos[len[i]] = i;
      }
    }
  }
  int endpos, max_ = 0;
  for (i = 1; i <= n; ++i) {
    if (~a[i]) {
      o[len[i]].insert((xxx){i, a[i]});
    }
    if (len[i] > max_) {
      max_ = len[i];
      endpos = i;
    }
  }
  for (i = n; i > endpos; --i) {
    if (~a[i]) o[len[i]].erase((xxx){i, a[i]});
  }
  int tmpval;
  if (a[endpos] == -1)
    tmpval = b[m];
  else
    tmpval = a[endpos];
  for (i = max_; i >= 1; --i) {
    ans[endpos] = tmpval;
    if (i == 1) break;
    if (!o[i - 1].empty() && (o[i - 1].begin()->val < tmpval)) {
      xxx tmp = *o[i - 1].begin();
      while (endpos > tmp.pos) {
        if (~a[endpos]) o[len[endpos]].erase((xxx){endpos, a[endpos]});
        --endpos;
      }
      tmpval = a[endpos];
    } else {
      if (a[endpos] == -1) --endpos;
      while (1) {
        if (~a[endpos])
          o[len[endpos]].erase((xxx){endpos, a[endpos]});
        else
          break;
        --endpos;
      }
      tmpval = *(lower_bound(b, b + m + 1, tmpval) - 1);
      s.erase(s.lower_bound(tmpval));
    }
  }
  for (i = 1; i <= n; ++i) {
    if (!ans[i]) {
      if (a[i] == -1)
        ans[i] = *s.begin(), s.erase(s.begin());
      else
        ans[i] = a[i];
    }
  }
  for (i = 1; i <= n; ++i) cout << ans[i] << ' ';
  cout << '\n';
  return 0;
}
