package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	for {
		scanner := bufio.NewScanner(os.Stdin)

		// 设置大缓冲区,防止大输入时出错
		buf := make([]byte, 1024*1024) // 1MB
		scanner.Buffer(buf, 1024*1024)
		scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔)

		// 读取第一行:n
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		scanner.Scan()
		num, _ := strconv.Atoi(scanner.Text())
		arr := make([]int, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			arr[i], _ = strconv.Atoi(scanner.Text())
		}
		fmt.Println(process(arr, num))
	}
}

// 单调栈思想,放置最大值,最小值
// 最大值所在的栈,单调递减
// 最小值所在的栈,单调递增
// 在left,right范围内求满足条件 arr[maxqueue[0]]-arr[minqueue[0]] < num
// right-left+1的值为子数组的长度
func process(arr []int, num int) int {
	maxqueue := []int{} // 单调递减
	minqueue := []int{} // 单调递增

	left := 0
	cnt := 0
	for right := 0; right < len(arr); right++ {
		for len(maxqueue) > 0 && arr[maxqueue[len(maxqueue)-1]] <= arr[right] {
			maxqueue = maxqueue[:len(maxqueue)-1]
		}
		maxqueue = append(maxqueue, right)

		for len(minqueue) > 0 && arr[minqueue[len(minqueue)-1]] >= arr[right] {
			minqueue = minqueue[:len(minqueue)-1]
		}
		minqueue = append(minqueue, right)

		for len(maxqueue) > 0 && len(minqueue) > 0 && arr[maxqueue[0]]-arr[minqueue[0]] > num {
			if maxqueue[0] == left {
				maxqueue = maxqueue[1:]
			}
			if minqueue[0] == left {
				minqueue = minqueue[1:]
			}
			left++
		}
		cnt += right - left + 1
	}
	return cnt
}