#include <bits/stdc++.h>
int n, m, k, l, s[100005], f[100005], len[100005], g[100005], pre[100005],
    p[100005], b[100005], lst[100005], inseq[100005], used[100005];
std::vector<std::pair<int, int> > a[100005];
std::pair<int, int> ans[100005];
int bs(int l, int r, int x) {
  if (l == r) return l;
  int mid = (l + r + 1) / 2;
  if (g[mid] < x) return bs(mid, r, x);
  return bs(l, mid - 1, x);
}
void solve1(int x) {
  int y = bs(0, l, f[x]);
  if (y == l) ++l;
  if (y == 0 & f[x] >= g[1]) return;
  g[y + 1] = f[x];
  p[y + 1] = x;
  len[x] = y + 1;
  pre[x] = p[y];
}
void solve2(int x) {
  int now = l;
  for (int i = m; i >= 1; i--) {
    while (s[i] <= g[now] && now > 0) --now;
    if (now == l) ++l;
    if (now == 0 && s[i] >= g[1]) continue;
    g[now + 1] = s[i];
    p[now + 1] = x;
  }
}
void getans() {
  int x = p[l], can = m;
  if (f[x] != -1)
    ans[l] = std::make_pair(x, f[x]);
  else
    ans[l] = std::make_pair(x, s[can]), used[can] = 1;
  for (int i = l - 1; i >= 1; i--) {
    if (f[x] != -1)
      x = pre[x];
    else {
      for (; b[i] < (int)a[i].size(); b[i]++)
        if (a[i][b[i]].first < x) break;
      if (b[i] >= (int)a[i].size() || a[i][b[i]].second >= ans[i + 1].second)
        x = lst[x];
      else
        x = a[i][b[i]].first;
    }
    if (f[x] != -1)
      ans[i] = std::make_pair(x, f[x]);
    else {
      while (can > 0 && s[can] >= ans[i + 1].second) --can;
      ans[i] = std::make_pair(x, s[can]);
      used[can] = 1;
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &f[i]);
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) scanf("%d", &s[i]);
  std::sort(s + 1, s + m + 1);
  int now = -1;
  for (int i = 1; i <= n; i++) {
    lst[i] = now;
    if (f[i] == -1) ++k, now = i;
  }
  g[1] = 1000000001;
  for (int i = 1; i <= n; i++) {
    if (f[i] != -1)
      solve1(i);
    else
      solve2(i);
  }
  for (int i = 1; i <= n; i++)
    if (f[i] != -1) a[len[i]].push_back(std::make_pair(f[i], i));
  for (int i = 1; i <= l; i++) std::sort(a[i].begin(), a[i].end());
  for (int i = 1; i <= n; i++)
    for (int j = 0; j < (int)a[i].size(); j++)
      std::swap(a[i][j].first, a[i][j].second);
  getans();
  int nxt = 1;
  for (int i = 1; i <= l; i++)
    f[ans[i].first] = ans[i].second, inseq[ans[i].first] = 1;
  for (int i = 1; i <= n; i++) {
    if (inseq[i] || f[i] != -1) continue;
    while (used[nxt] && nxt < m) ++nxt;
    f[i] = s[nxt];
    used[nxt] = 1;
  }
  for (int i = 1; i <= n; i++) printf("%d ", f[i]);
  puts("");
  return 0;
}
