#P10995. 【MX-J3-T2】 Substring

【MX-J3-T2】 Substring

背景

原题链接:https://oier.team/problems/J3C。

题目描述

你有一个数列 aa,其中 1∼n1\sim n 各出现了一次。

当你任意选一对 1≤l≤r≤n1\le l\le r\le n,并将 al,al+1,…,ara_l,a_{l+1},\ldots,a_r 排成一行,你就得到了 aa 的一个子串,记为 al∼ra_{l\sim r},称 ll 为左端点,rr 为右端点。

你需要把 aa 所有子串按字典序从小到大排序。但是为了避免输出量过大,我会给出 qq 个问题,每次给出一个 kk,求字典序第 kk 小的子串左右端点。


如果你不知道什么是字典序,看这里:

对于两个数列 p,qp,q,称 pp 的字典序小于 qq(记为 p<qp<q),当且仅当存在自然数 kk 使 p,qp,q 的前 kk 个数相同且 pk+1<qk+1p_{k+1}<q_{k+1}。

特别地,若 pp 是 qq 的前缀且 p≠qp\ne q,也认为 pp 的字典序小于 qq。

例如:

  • [1,2]<[3,2][1,2]<[3,2](当 k=0k=0)
  • [3,1,100]<[3,2,1][3,1,100]<[3,2,1](当 k=1k=1)
  • [3,4]<[3,4,6][3,4]<[3,4,6](pp 是 qq 前缀)

输入格式

输入的第一行有两个正整数 n,qn,q 表示序列长度和询问个数。

第二行有 nn 个正整数 a1,a2,…,ana_1,a_2,\ldots,a_n,表示这个数列。

之后有 qq 行,每行有一个正整数 kk,表示要求的子串的排名。

输出格式

对于每个问题,输出一行两个整数 l,rl,r,表示字典序第 kk 小的子串是 al∼ra_{l\sim r}。

3 6
3 1 2
1
2
3
4
5
6

2 2
2 3
3 3
1 1
1 2
1 3

50 25
42 22 27 8 44 11 14 31 37 10 48 15 12 40 13 4 25 9 19 5 2 18 6 1 32 3 38 33 43 34 46 47 23 35 21 20 45 39 50 7 36 17 24 29 16 30 49 26 28 41
1178
991
755
1094
689
132
671
635
421
659
448
334
327
213
1206
453
1160
583
388
781
150
692
23
1162
62

37 48
27 44
3 28
1 46
43 47
20 34
33 37
2 19
15 44
2 43
7 27
6 31
6 24
4 29
32 37
7 32
5 44
19 47
13 47
44 45
23 24
43 50
24 46
5 46
26 30

提示

【样例解释 #1】

数列 3,1,23,1,2 共有 66 个子串,从小到大排序的结果为:[1],[1,2],[2],[3],[3,1],[3,1,2][1],[1,2],[2],[3],[3,1],[3,1,2]。

【数据范围】

测试点编号 n≤n\le q≤q\le 特殊性质
1∼31\sim 3 200200
4∼74\sim 7 10001000 3×1053\times 10^5
8∼98\sim 9 30003000
10∼1310\sim 13 3×1053\times 10^5 1010
14∼1514\sim 15 3×1053\times 10^5 ai=ia_i=i
16∼2016\sim 20

对于全体数据,保证 1≤n,q≤3×1051\le n,q\le 3\times 10^5,1≤k≤n(n+1)21\le k\le \dfrac{n(n+1)}{2},aia_i 中 1∼n1\sim n 各有一个,输入皆为整数。