package main
import (
"io"
"os"
"strconv"
)
func max64(a, b int64) int64 {
if a > b {
return a
}
return b
}
func min64(a, b int64) int64 {
if a < b {
return a
}
return b
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int64 {
for idx < len(data) && (data[idx] == ' ' || data[idx] == '\n' || data[idx] == '\r' || data[idx] == '\t') {
idx++
}
var sign int64 = 1
if idx < len(data) && data[idx] == '-' {
sign = -1
idx++
}
var v int64
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
v = v*10 + int64(data[idx]-'0')
idx++
}
return sign * v
}
n := int(nextInt())
L := nextInt()
R := nextInt()
K := nextInt()
signs := make([]byte, max(0, n-1))
if n > 0 {
prev := nextInt()
for i := 0; i < n-1; i++ {
cur := nextInt()
if prev < cur {
signs[i] = '<'
} else if prev == cur {
signs[i] = '='
} else {
signs[i] = '>'
}
prev = cur
}
}
if n == 0 {
os.Stdout.Write([]byte("\n"))
return
}
lo := make([]int64, n)
hi := make([]int64, n)
lo[n-1], hi[n-1] = L, R
for i := n - 2; i >= 0; i-- {
switch signs[i] {
case '=':
lo[i] = lo[i+1]
hi[i] = hi[i+1]
case '<':
lo[i] = max64(L, lo[i+1]-K)
hi[i] = min64(R, hi[i+1]-1)
case '>':
lo[i] = max64(L, lo[i+1]+1)
hi[i] = min64(R, hi[i+1]+K)
}
if lo[i] > hi[i] {
os.Stdout.Write([]byte("-1\n"))
return
}
}
b := make([]int64, n)
b[0] = lo[0]
for i := 1; i < n; i++ {
switch signs[i-1] {
case '=':
b[i] = b[i-1]
if b[i] < lo[i] || b[i] > hi[i] {
os.Stdout.Write([]byte("-1\n"))
return
}
case '<':
left := max64(lo[i], b[i-1]+1)
right := min64(hi[i], b[i-1]+K)
if left > right {
os.Stdout.Write([]byte("-1\n"))
return
}
b[i] = left
case '>':
left := max64(lo[i], b[i-1]-K)
right := min64(hi[i], b[i-1]-1)
if left > right {
os.Stdout.Write([]byte("-1\n"))
return
}
b[i] = left
}
}
out := make([]byte, 0, n*12)
for i, v := range b {
if i > 0 {
out = append(out, ' ')
}
out = strconv.AppendInt(out, v, 10)
}
out = append(out, '\n')
os.Stdout.Write(out)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}