← Home
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()
}