← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

type Node struct {
	idx  int32
	val  int32
	prev int32
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n int
	if _, err := fmt.Fscan(in, &n); err != nil {
		return
	}

	A := make([]int32, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &A[i])
	}

	var m int
	fmt.Fscan(in, &m)

	C := make([]int32, m)
	for i := 0; i < m; i++ {
		fmt.Fscan(in, &C[i])
	}

	sort.Slice(C, func(i, j int) bool { return C[i] > C[j] })

	var uniqC []int32
	if m > 0 {
		uniqC = append(uniqC, C[0])
		for i := 1; i < m; i++ {
			if C[i] != C[i-1] {
				uniqC = append(uniqC, C[i])
			}
		}
	}
	C = uniqC

	nodes := make([]Node, 1, 10000000)
	nodes[0] = Node{idx: -1, val: -1, prev: 0}

	DP_val := make([]int32, 0, n)
	DP_node := make([]int32, 0, n)

	type Update struct {
		pos  int
		val  int32
		prev int32
	}
	var updates []Update

	for i := 0; i < n; i++ {
		if A[i] != -1 {
			v := A[i]
			l, r := 0, len(DP_val)
			for l < r {
				mid := int(uint(l+r) >> 1)
				if DP_val[mid] >= v {
					r = mid
				} else {
					l = mid + 1
				}
			}
			pos := l
			var prev int32 = 0
			if pos > 0 {
				prev = DP_node[pos-1]
			}
			nodes = append(nodes, Node{idx: int32(i), val: v, prev: prev})
			nid := int32(len(nodes) - 1)

			if pos == len(DP_val) {
				DP_val = append(DP_val, v)
				DP_node = append(DP_node, nid)
			} else {
				DP_val[pos] = v
				DP_node[pos] = nid
			}
		} else {
			updates = updates[:0]
			pos := len(DP_val)
			for _, c := range C {
				for pos > 0 && DP_val[pos-1] >= c {
					pos--
				}
				if pos == len(DP_val) || c < DP_val[pos] {
					var prev int32 = 0
					if pos > 0 {
						prev = DP_node[pos-1]
					}
					if len(updates) > 0 && updates[len(updates)-1].pos == pos {
						updates[len(updates)-1] = Update{pos: pos, val: c, prev: prev}
					} else {
						updates = append(updates, Update{pos: pos, val: c, prev: prev})
					}
				}
			}
			for _, u := range updates {
				if u.pos == len(DP_val) || u.val < DP_val[u.pos] {
					nodes = append(nodes, Node{idx: int32(i), val: u.val, prev: u.prev})
					nid := int32(len(nodes) - 1)
					if u.pos == len(DP_val) {
						DP_val = append(DP_val, u.val)
						DP_node = append(DP_node, nid)
					} else {
						DP_val[u.pos] = u.val
						DP_node[u.pos] = nid
					}
				}
			}
		}
	}

	if len(DP_node) > 0 {
		curr := DP_node[len(DP_node)-1]
		for curr != 0 {
			node := nodes[curr]
			if A[node.idx] == -1 {
				A[node.idx] = node.val
			}
			curr = node.prev
		}
	}

	cIdx := 0
	for i := 0; i < n; i++ {
		if A[i] == -1 {
			A[i] = C[cIdx]
			cIdx = (cIdx + 1) % len(C)
		}
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, A[i])
	}
	fmt.Fprintln(out)
}
```