#include <bits/stdc++.h>
using namespace std;
namespace io {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT) flush();
}
template <class I>
inline void gi(I &x) {
  for (f = 1, c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                              (iS == iT ? EOF : *iS++))
                            : *iS++);
       c < '0' || c > '9';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    x = (x << 1) + (x << 3) + (c & 15);
  x *= f;
}
template <class I>
inline void get(I &x) {
  x = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                   (iS == iT ? EOF : *iS++))
                : *iS++);
}
template <class I>
inline void print(I x) {
  if (!x) putc('0');
  if (x < 0) putc('-'), x = -x;
  while (x) qu[++qr] = x % 10 + '0', x /= 10;
  while (qr) putc(qu[qr--]);
}
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
}  // namespace io
using io ::get;
using io ::gi;
using io ::print;
using io ::putc;
const int N = 1e5 + 5, inf = 2e9;
int m, a[N], b[N], c[N], f[N], g[N], l[N], p[N], ans[N], use[N];
inline int find(register int x) {
  register int p = lower_bound(b + 1, b + 1 + m, x) - b - 1;
  use[p] = 1;
  return b[p];
}
int main() {
  register int n, i, j, k, x, cnt;
  register bool flag;
  gi(n);
  for (i = 1; i <= n; ++i) gi(a[i]);
  a[++n] = inf;
  gi(m);
  for (i = 1; i <= m; ++i) gi(b[i]);
  sort(b + 1, b + 1 + m);
  for (i = 1; i <= m; ++i) c[i] = b[i];
  cnt = unique(c + 1, c + 1 + m) - c - 1;
  fill(f + 1, f + 1 + n, inf);
  for (i = 1; i <= n; ++i)
    if (a[i] != -1) {
      j = lower_bound(f + 1, f + 1 + n, a[i]) - f - 1;
      l[i] = j + 1;
      p[i] = g[j];
      f[j + 1] = a[i];
      g[j + 1] = i;
    } else {
      j = n;
      for (x = cnt; x; --x) {
        while (j && f[j] >= c[x]) --j;
        f[j + 1] = c[x];
        g[j + 1] = i;
      }
    }
  for (i = l[n] - 1, j = n, x = a[n]; i; --i)
    if (a[j] != -1) {
      j = p[j];
      if (a[j] == -1)
        ans[j] = x = find(x);
      else
        x = a[j];
    } else {
      flag = 0;
      for (k = j - 1; k; --k)
        if (a[k] != -1 && a[k] < x && l[k] == i) {
          x = a[k];
          j = k;
          flag = 1;
          break;
        }
      if (flag) continue;
      for (k = j - 1; k && a[k] != -1; --k)
        ;
      ans[k] = x = find(x);
      j = k;
    }
  j = 1;
  for (i = 1; i < n; ++i) {
    if (a[i] != -1)
      ans[i] = a[i];
    else if (!ans[i]) {
      while (use[j]) ++j;
      use[j] = 1;
      ans[i] = b[j];
    }
    print(ans[i]);
    putc(' ');
  }
  putc('\n');
  return 0;
}
