```go
package main
import (
"bufio"
"fmt"
"os"
)
const INF = 1 << 30
func main() {
reader := bufio.NewReader(os.Stdin)
var n, s, l int
fmt.Fscan(reader, &n, &s, &l)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(reader, &a[i])
}
dp := make([]int, n+1)
for i := 1; i <= n; i++ {
dp[i] = INF
}
minDeque := make([]int, 0)
maxDeque := make([]int, 0)
dpDeque := make([]int, 0)
left := 0
for i := 1; i <= n; i++ {
for len(minDeque) > 0 && a[minDeque[len(minDeque)-1]] > a[i-1] {
minDeque = minDeque[:len(minDeque)-1]
}
minDeque = append(minDeque, i-1)
for len(maxDeque) > 0 && a[maxDeque[len(maxDeque)-1]] < a[i-1] {
maxDeque = maxDeque[:len(maxDeque)-1]
}
maxDeque = append(maxDeque, i-1)
for len(minDeque) > 0 && len(maxDeque) > 0 && a[maxDeque[0]]-a[minDeque[0]] > s {
if minDeque[0] == left {
minDeque = minDeque[1:]
}
if maxDeque[0] == left {
maxDeque = maxDeque[1:]
}
left++
}
if i-l >= 0 {
idx := i - l
if dp[idx] < INF {
for len(dpDeque) > 0 && dp[dpDeque[len(dpDeque)-1]] >= dp[idx] {
dpDeque = dpDeque[:len(dpDeque)-1]
}
dpDeque = append(dpDeque, idx)
}
}
for len(dpDeque) > 0 && dpDeque[0] < left {
dpDeque = dpDeque[1:]
}
if len(dpDeque) > 0 {
dp[i] = dp[dpDeque[0]] + 1
}
}
if dp[n] == INF {
fmt.Println(-1)
} else {
fmt.Println(dp[n])
}
}
```