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