#p7101. 搬运行李(luggage)

0

搬运行李(luggage)

搬运行李(luggage)

题目描述

Y 同学是一名搬运员,他要依次经过一排仓库收取货物。

共有 NN 个仓库,从西向东依次编号为 1,2,…,N1,2,\dots,N。第 ii 个仓库中有一件重量为 AiA_i 的货物。

Y 同学会选择某个仓库 ss 作为出发点,开始时手中没有任何货物。随后他会从仓库 ss 开始,一直向东依次访问仓库 s,s+1,s+2,…s,s+1,s+2,\dots。每到一个仓库,他都会立刻拿起该仓库中的货物,并将其加入当前负重中,而且之后不会放下已经拿到的货物。

在到达某个仓库后,Y 同学总是按如下过程行动:

先取走当前仓库中的货物,将其加入负重中。 然后检查当前负重总和。 如果当前负重严格大于 KK,那么他无法继续前进,并停在当前仓库。 如果当前负重不超过 KK,且当前仓库不是第 NN 个仓库,那么他会前往东边相邻的下一个仓库。 如果当前负重不超过 KK,且当前仓库已经是第 NN 个仓库,那么由于已经没有更东边的仓库,他也会停在当前仓库。

换句话说,从仓库 ss 出发时,Y 同学会依次访问若干个连续仓库,并最终停在某个仓库 tt。如果在访问到仓库 tt 后,区间 [s,t][s,t] 的货物总重量第一次严格超过 KK,那么他就停在 tt;如果直到仓库 NN 都没有超过 KK,那么他就停在仓库 NN。

定义 f(s)f(s) 表示从仓库 ss 出发时,Y 同学最终停下来的仓库编号。

现在有 QQ 次询问。每次询问给出两个整数 Lj,RjL_j,R_j,你需要计算:

f(Lj)+f(Lj+1)+⋯+f(Rj)f(L_j) + f(L_j+1) + \cdots + f(R_j)

输入格式

第一行输入三个整数 N,K,QN,K,Q,分别表示仓库数量、负重上限以及询问次数。

第二行输入 NN 个整数 A1,A2,…,ANA_1,A_2,\dots,A_N,表示每个仓库中货物的重量。

接下来 QQ 行,每行输入两个整数 Lj,RjL_j,R_j,表示一次询问的起点编号范围。对于这一询问,需要求出所有起点属于区间 [Lj,Rj][L_j,R_j] 时对应的停止位置编号之和。

输出格式

输出共 QQ 行。

第 jj 行输出一个整数,表示第 jj 次询问的答案,即

f(Lj)+f(Lj+1)+⋯+f(Rj)f(L_j) + f(L_j+1) + \cdots + f(R_j)

样例

样例输入 #1

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

样例输出 #1

23
13
15

数据范围与约定

对于 100100% 的数据,保证:

  • 1≤N≤2×1051 \le N \le 2 \times 10^5;
  • 1≤K≤10151 \le K \le 10^{15};
  • 1≤Q≤2×1051 \le Q \le 2 \times 10^5;
  • 1≤Ai≤1091 \le A_i \le 10^9;
  • 1≤Lj≤Rj≤N1 \le L_j \le R_j \le N。
测试点编号 分值 N≤N \le Q≤Q \le 特殊性质
1~2 10 2020 A
3~4 20002000 B
5~6 10410^4 C
7~10 20 5×1045 \times 10^4 无
11~14 2×1052 \times 10^5 B
15~20 30 无
  • 特殊性质 A:保证对于任意 ii,都有 Ai>KA_i > K。
  • 特殊性质 B:保证序列 AA 单调不降。
  • 特殊性质 C:保证所有询问都满足 Lj=RjL_j = R_j。