F.前驱与后继 Next and Prev
时间限制:15 秒
内存限制:1024 兆字节
设 p1,…,pn 是 [1,…,n] 的一个排列。
定义 p 的 q-子序列 是 [1,q] 的一个排列,它的元素在 p1,…,pn 中的相对顺序保持不变。
也就是说,从 p 中提取所有不超过 q 的元素,保持原有顺序,得到的序列就是 p 的 q-子序列。
对于一个数组 a,定义:
- pre(i):满足 pre(i)<i 且 apre(i)>ai 的最大下标;若不存在,令 pre(i)=−10100。
- nxt(i):满足 nxt(i)>i 且 anxt(i)>ai 的最小下标;若不存在,令 nxt(i)=10100。
对于每个 q(满足 1≤q≤n),设 a1,…,aq 是 p 的 q-子序列。
按照定义计算每个位置 i 的 pre(i) 和 nxt(i)。
给定若干个询问值 x,对每个 x 计算:
i=1∑qmin(nxt(i)−pre(i), x)
输入格式
输入包含多组测试数据。
第一行一个整数 t(1≤t≤104),表示测试数据组数。
每组测试数据格式如下:
- 第一行一个整数 n(1≤n≤3×105),表示排列长度。
- 第二行 n 个整数 p1,…,pn(1≤pi≤n),表示初始排列。
- 接下来按 q=1 到 q=n 的顺序,依次给出每个 q 对应的询问:
- 一个整数 k(0≤k≤105),表示该 q 的询问数量。
- 一行 k 个整数 x(1≤x≤q),表示每个询问的参数。
保证:
- 所有测试数据的 n 之和 ≤3×105;
- 所有测试数据的 k 之和 ≤105。
输出格式
对每个询问,输出一行一个整数,表示答案。
样例输入
1
7
6 1 4 3 2 5 7
1 1
0
1 3
1 2
3 1 2 3
1 3
2 2 6
样例输出
1
9
8
5
10
14
16
14
30
样例解释
-
q=1 时,q-子序列为 [1],pre=[−10100],nxt=[10100]。
答案:min(10100−(−10100), 1)=1。
-
q=5 时,q-子序列为 [1,4,3,2,5]。
pre=[−10100,−10100,2,3,−10100]
nxt=[2,5,5,5,10100]
询问 x=1 答案为 5,x=2 答案为 10,x=3 答案为 14。