#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 1e5 + 4;
int L[maxn], P[maxn], F[maxn], G[maxn], newp = 0;
int A[maxn], B[maxn], ans[maxn];
int main() {
  int N, M;
  cin >> N;
  for (int i = 1; i <= N; ++i) cin >> A[i];
  cin >> M;
  multiset<int> st;
  for (int i = 1; i <= M; ++i) cin >> B[i], st.insert(B[i]);
  sort(B + 1, B + M + 1, greater<int>());
  for (int i = 1; i <= N; ++i) {
    if (A[i] >= 0) {
      int id = lower_bound(F, F + newp + 1, A[i]) - F;
      F[id] = A[i], G[id] = i;
      L[i] = id;
      P[i] = G[id - 1];
      newp = max(id, newp);
    } else {
      int id = newp + 1;
      for (int j = 1; j <= M; ++j) {
        const int v = B[j];
        while (id > 1 && F[id - 1] > v) --id;
        if (F[id - 1] >= v) continue;
        F[id] = v, G[id] = i;
        L[i] = id;
        newp = max(id, newp);
      }
    }
  }
  int x = G[newp], p = newp;
  if (A[x] == -1) {
    ans[x] = B[1];
    st.erase(--st.end());
  }
  while (p > 1) {
    if (A[x] != -1) {
      ans[x] = A[x];
      if (A[P[x]] == -1)
        ans[P[x]] = *(--st.lower_bound(A[x])), st.erase(st.find(ans[P[x]]));
      x = P[x];
    } else {
      bool flag = true;
      for (int i = x - 1; i; --i) {
        if (A[i] >= 0 && L[i] == p - 1 && A[i] < ans[x]) {
          x = i;
          flag = false;
          break;
        }
      }
      if (flag) {
        for (int i = x - 1; i; --i) {
          if (A[i] < 0) {
            ans[i] = *(--st.lower_bound(ans[x])), st.erase(st.find(ans[i]));
            x = i;
            break;
          }
        }
      }
    }
    --p;
  }
  for (int i = 1; i <= N; ++i) {
    if (A[i] < 0 && ans[i] == 0)
      ans[i] = *st.begin(), st.erase(st.begin());
    else if (A[i] > 0)
      ans[i] = A[i];
  }
  for (int i = 1; i <= N; ++i) cout << ans[i] << ' ';
  return 0;
}
