← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

var (
	a       []int
	p       []int
	P_A     []int
	P_B     []int
	BIT     []int
	BIT_idx []int
	ans_l   []int
	ans_r   []int
	n, k    int
)

func check_M(v int) bool {
	p[0] = 0
	for i := 1; i <= n; i++ {
		if a[i] <= v {
			p[i] = p[i-1] + 1
		} else {
			p[i] = p[i-1] - 1
		}
	}
	min_P := int(1e9)
	for r := k; r <= n; r++ {
		l := r - k
		if p[l] < min_P {
			min_P = p[l]
		}
		if p[r]-min_P >= 0 {
			return true
		}
	}
	return false
}

func check_m(v int) bool {
	if v < 0 {
		return true
	}
	p[0] = 0
	for i := 1; i <= n; i++ {
		if a[i] <= v {
			p[i] = p[i-1] + 1
		} else {
			p[i] = p[i-1] - 1
		}
	}
	max_P := int(-1e9)
	for r := k; r <= n; r++ {
		l := r - k
		if p[l] > max_P {
			max_P = p[l]
		}
		if p[r]-max_P <= 0 {
			return true
		}
	}
	return false
}

func solve(L, R int) {
	if L > R {
		return
	}
	mid := L + (R-L)/2

	P_A[0] = 0
	P_B[0] = 0
	for i := 1; i <= n; i++ {
		if a[i] <= mid-1 {
			P_A[i] = P_A[i-1] + 1
		} else {
			P_A[i] = P_A[i-1] - 1
		}
		if a[i] <= mid {
			P_B[i] = P_B[i-1] + 1
		} else {
			P_B[i] = P_B[i-1] - 1
		}
	}

	best_l, best_r := -1, -1
	updates := make([]int, 0)

	for r := k; r <= n; r++ {
		l := r - k
		m_idx := 2*n + 2 - (P_A[l] + n + 1)
		for idx := m_idx; idx <= 2*n+2; idx += idx & -idx {
			if P_B[l] < BIT[idx] {
				BIT[idx] = P_B[l]
				BIT_idx[idx] = l
			}
		}
		updates = append(updates, m_idx)

		q_idx := 2*n + 2 - (P_A[r] + n + 1)
		min_B := int(1e9)
		opt_l := -1
		for idx := q_idx; idx > 0; idx -= idx & -idx {
			if BIT[idx] < min_B {
				min_B = BIT[idx]
				opt_l = BIT_idx[idx]
			}
		}

		if min_B <= P_B[r] {
			best_l = opt_l + 1
			best_r = r
			break
		}
	}

	for _, m_idx := range updates {
		for idx := m_idx; idx <= 2*n+2; idx += idx & -idx {
			BIT[idx] = 1e9
		}
	}

	sub := make([]int, best_r-best_l+1)
	copy(sub, a[best_l:best_r+1])
	sort.Ints(sub)
	m := len(sub)
	v1 := sub[(m-1)/2]
	v2 := sub[m/2]

	for v := max(L, v1); v <= min(R, v2); v++ {
		ans_l[v] = best_l
		ans_r[v] = best_r
	}

	solve(L, v1-1)
	solve(v2+1, R)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	buffer := make([]byte, 1024*1024)
	scanner.Buffer(buffer, 1024*1024*10)

	readInt := func() int {
		scanner.Scan()
		res := 0
		sign := 1
		for _, b := range scanner.Bytes() {
			if b == '-' {
				sign = -1
			} else {
				res = res*10 + int(b-'0')
			}
		}
		return res * sign
	}

	if !scanner.Scan() {
		return
	}
	t_str := scanner.Bytes()
	t := 0
	for _, b := range t_str {
		t = t*10 + int(b-'0')
	}

	maxN := 300005
	a = make([]int, maxN)
	p = make([]int, maxN)
	P_A = make([]int, maxN)
	P_B = make([]int, maxN)
	BIT = make([]int, 2*maxN+5)
	BIT_idx = make([]int, 2*maxN+5)
	ans_l = make([]int, maxN)
	ans_r = make([]int, maxN)

	for i := 0; i < len(BIT); i++ {
		BIT[i] = 1e9
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for tc := 0; tc < t; tc++ {
		n = readInt()
		k = readInt()
		for i := 1; i <= n; i++ {
			a[i] = readInt()
		}

		low, high := 1, n
		v_min := n + 1
		for low <= high {
			mid := low + (high-low)/2
			if check_M(mid) {
				v_min = mid
				high = mid - 1
			} else {
				low = mid + 1
			}
		}

		low, high = 1, n
		v_max := 0
		for low <= high {
			mid := low + (high-low)/2
			if check_m(mid - 1) {
				v_max = mid
				low = mid + 1
			} else {
				high = mid - 1
			}
		}

		if v_min > v_max {
			fmt.Fprintln(out, 0)
			continue
		}

		solve(v_min, v_max)

		count := v_max - v_min + 1
		fmt.Fprintln(out, count)
		for v := v_min; v <= v_max; v++ {
			fmt.Fprintln(out, v, ans_l[v], ans_r[v])
		}
	}
}