package main
import (
"bufio"
"fmt"
"io"
"os"
"sort"
)
type Event struct {
pos int64
delta int
}
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 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 v * sign
}
n := int(nextInt())
l := nextInt()
v1 := nextInt()
v2 := nextInt()
q := v1 + v2
m := int64(2) * l * q
d := l * v2
events := make([]Event, 0, 2*n)
cur := 0
for i := 0; i < n; i++ {
a := nextInt()
s := a * q
if s < d {
cur++
}
events = append(events, Event{pos: s, delta: -1})
e := s - d
if e < 0 {
e += m
}
events = append(events, Event{pos: e, delta: 1})
}
sort.Slice(events, func(i, j int) bool {
return events[i].pos < events[j].pos
})
ans := make([]int64, n+1)
prev := int64(0)
i := 0
for i < len(events) {
pos := events[i].pos
if pos > prev {
ans[cur] += pos - prev
prev = pos
}
delta := 0
for i < len(events) && events[i].pos == pos {
delta += events[i].delta
i++
}
cur += delta
}
if prev < m {
ans[cur] += m - prev
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
for k := 0; k <= n; k++ {
fmt.Fprintf(out, "%.12f\n", float64(ans[k])/float64(m))
}
out.Flush()
}