#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX_N = 100005;
int a[MAX_N], b[MAX_N];
int n, m;
int dp[MAX_N], pos[MAX_N];
bool used[MAX_N];
vector<int> g[MAX_N];
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  cin >> m;
  for (int i = 0; i < m; i++) cin >> b[i];
  sort(b, b + m);
  reverse(b, b + m);
  memset(dp, 0x3f, sizeof(dp));
  for (int i = 0; i < n; i++) {
    if (a[i] == -1) {
      int pt = 0;
      for (int j = 0; j < m; j++) {
        while (dp[pt] < b[j]) pt++;
        while (pt && dp[pt - 1] >= b[j]) pt--;
        dp[pt] = b[j];
      }
    } else {
      int p = lower_bound(dp, dp + MAX_N, a[i]) - dp;
      g[p].push_back(i);
      pos[i] = p;
      dp[p] = a[i];
    }
  }
  int k = lower_bound(dp, dp + MAX_N, INF) - dp - 1;
  reverse(b, b + m);
  for (int i = n - 1; i >= 0; i--) {
    if (a[i] == -1) {
      int p = lower_bound(g[k].begin(), g[k].end(), i) - g[k].begin();
      if (!p || a[g[k][p - 1]] >= dp[k + 1]) {
        int x = lower_bound(b, b + m, dp[k + 1]) - b - 1;
        a[i] = dp[k] = b[x];
        used[x] = true;
        k--;
      }
    } else if (pos[i] == k) {
      dp[k] = a[i];
      k--;
    }
    if (k < 0) break;
  }
  int pt = 0;
  for (int i = 0; i < n; i++) {
    if (a[i] == -1) {
      while (used[pt]) pt++;
      a[i] = b[pt];
      used[pt] = true;
    }
  }
  for (int i = 0; i < n; i++) cout << a[i] << " \n"[i == n - 1];
  return 0;
}
