#include <bits/stdc++.h>
const int oo = 0x3f3f3f3f;
template <typename T>
inline bool chkmax(T &a, T b) {
  return a < b ? a = b, true : false;
}
template <typename T>
inline bool chkmin(T &a, T b) {
  return a > b ? a = b, true : false;
}
template <typename T>
T read(T &first) {
  int f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (first = 0; isdigit(ch); ch = getchar()) first = 10 * first + ch - '0';
  return first *= f;
}
template <typename T>
void write(T first) {
  if (first < 0) {
    putchar('-');
    first = -first;
  }
  static char s[20];
  int top = 0;
  for (; first; first /= 10) s[++top] = first % 10 + '0';
  if (top == 0)
    putchar('0');
  else
    while (top) putchar(s[top--]);
}
const int MAXN = 1e5 + 5, MAXK = 1e3 + 5;
int N, M;
int A[MAXN], B[MAXN], B0[MAXN];
void input() {
  read(N);
  for (int i = 1; i <= N; ++i) {
    read(A[i]);
  }
  read(M);
  for (int i = 0; i < M; ++i) {
    read(B[i]);
  }
}
void solve() {
  std::sort(B, B + M);
  memcpy(B0, B, sizeof(B));
  M = std::unique(B, B + M) - B;
  A[0] = 0;
  A[(++N)++] = 1e9;
  static int cnt[MAXN];
  cnt[0] = 0;
  for (int i = 1; i < N; ++i) {
    cnt[i] = cnt[i - 1] + (A[i] == -1);
  }
  static int f[MAXN], fidx[MAXN], prev[MAXN], lis[MAXN];
  memset(f, +oo, sizeof(f));
  f[0] = -1;
  for (int i = 0; i < N; ++i) {
    if (A[i] != -1) {
      int j = std::lower_bound(f, f + N, A[i]) - f;
      f[j] = A[i];
      fidx[j] = i;
      prev[i] = fidx[j - 1];
      lis[i] = j;
    } else {
      for (int j = M - 1, k = N - 1; j >= 0; --j) {
        while (k >= 0 && f[k] >= B[j]) {
          --k;
        }
        ++k;
        f[k] = B[j];
        fidx[k] = -1;
      }
    }
  }
  static bool chosen[MAXN];
  int r = N - 1;
  while (r > 0) {
    if (prev[r] != -1) {
      r = prev[r];
    } else {
      for (int l = r - 1; l >= 0; --l) {
        if (A[l] != -1 && A[l] < A[r]) {
          int req = lis[r] - lis[l] - 1;
          if (req <= A[r] - A[l] - 1 && req <= cnt[r] - cnt[l]) {
            int bl = std::upper_bound(B, B + M, A[l]) - B;
            int br = std::lower_bound(B, B + M, A[r]) - B;
            if (req <= br - bl) {
              fprintf(stderr, "%d %d %d %d req=%d\n", l, r, bl, br, req);
              int ap = l + 1, bp = bl;
              while (req > 0) {
                if (A[ap] == -1) {
                  A[ap] = B[bp];
                  assert(chosen[bp] == false);
                  chosen[bp++] = true;
                  --req;
                }
                ++ap;
              }
              r = l;
              break;
            }
          }
        }
      }
    }
  }
  for (int i = 0, j = 0, k = 0; i < N; ++i) {
    if (A[i] == -1) {
      while (B0[j + 1] != B[k] && chosen[k]) {
        ++j;
        ++k;
      }
      A[i] = B0[j++];
      if (B0[j] != B[k]) ++k;
    }
  }
  for (int i = 1; i < N - 1; ++i) {
    write(A[i]);
    putchar(' ');
  }
  putchar('\n');
}
int main() {
  input();
  solve();
  return 0;
}
