#CF2128e2. 子中位数(困难版)

子中位数(困难版)

每次测试时间限制:33
内存限制:512512 兆字节
题目描述 这是该问题的困难版本。唯一的不同是,在这个版本中,你需要为所有子中位数找到对应的子数组。

只有当问题的两个版本都解决后,你才能进行 hack。

一个整数 vv 是长度为 mm 的数组 bb中位数,当且仅当:

  • vv 至少大于等于数组中的 m2\lceil \frac{m}{2} \rceil 个元素,并且
  • vv 至少小于等于数组中的 m2\lceil \frac{m}{2} \rceil 个元素。

例如:

  • [9,3,7][9,3,7] 的唯一中位数是 77
  • [5,3,7,9][5,3,7,9] 的中位数是 556677
  • [2,2,2][2,2,2] 的唯一中位数是 22

你被给定一个整数 kk 和一个数组 a1,,ana_1, \dots, a_n,数组元素在 11nn 之间。

如果一个整数 vv1vn1 \le v \le n)满足:存在至少一对下标 (l,r)(l,r) 使得

  • 1lrn1 \le l \le r \le n
  • rl+1kr - l + 1 \ge k
  • vv 是子数组 [al,,ar][a_l, \dots, a_r] 的一个中位数,

则称 vv子中位数

请找出所有子中位数,并对每个子中位数给出任意一个对应的子数组下标 (l,r)(l,r)


输入
每个测试点包含多个测试用例。第一行包含一个整数 tt1t500001 \le t \le 50000)——测试用例的数量。
每个测试用例的第一行包含两个整数 nnkk1kn3000001 \le k \le n \le 300000)。
第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n1ain1 \le a_i \le n)。
保证所有测试用例的 nn 之和不超过 300000300000


输出
对于每个测试用例,按以下格式输出答案:

  • 第一行输出一个整数 cc,表示子中位数的个数。
  • 接下来的 cc 行,每行输出三个整数 viv_ilil_irir_i,满足:
    • rili+1kr_i - l_i + 1 \ge k
    • viv_i 是子数组 [ali,,ari][a_{l_i}, \dots, a_{r_i}] 的一个中位数。

每个子中位数恰好报告一次,即 v1,,vcv_1, \dots, v_c 必须互不相同。报告的顺序无关紧要。

如果有多个解,输出任意一个。


示例
输入

7
4 3
4 1 2 4
5 2
1 2 3 2 1
5 3
1 2 3 2 1
5 3
1 1 2 5 3
1 1
1
2 1
2 1
4 1
1 2 1 3

输出

3
2 1 4
3 1 4
4 1 4
3
1 4 5
2 1 5
3 3 4
1
2 2 4
3
1 1 3
2 2 4
3 3 5
1
1 1 1
2
1 1 2
2 1 2
3
1 1 1
2 2 2
3 4 4

注释
在第一个测试用例中,长度至少为 k=3k=3 的子数组有:

  • (l=1,r=3)(l=1,r=3)[4,1,2][4,1,2],唯一中位数是 22
  • (l=2,r=4)(l=2,r=4)[1,2,4][1,2,4],唯一中位数是 22
  • (l=1,r=4)(l=1,r=4)[4,1,2,4][4,1,2,4],中位数是 223344

在第二个测试用例中,一个可能的输出是:

  • (l=4,r=5)(l=4,r=5)[2,1][2,1],中位数是 1122
  • (l=1,r=5)(l=1,r=5):唯一中位数是 22
  • (l=3,r=4)(l=3,r=4)[3,2][3,2],中位数是 2233

所有这些子数组的长度确实至少为 22。注意,可以证明没有长度至少为 22 的子数组能使 4455 成为中位数。