问题3170--前缀和太简单喵~

3170: 前缀和太简单喵~

时间限制: 1 Sec  内存限制: 128 MB
提交: 614  解决: 98
[状态] [讨论版] [提交] [命题人:]
题目描述

C 从零开始的 C 语言生活,决定先从前缀和入手。

为此,他向喵喵提出了一系列问题:



Q: 前缀和是什么?

A: 前缀和可以简单理解为 “数列的前 n 项的和",是一种重要的预处理方式,能大大降低查询的时间复杂度。

    具体的说,对于一个长度为 n 的数组 a 。我们按照 构造一个数组 b 。则称数组 b 为数组 a 的前缀和数组。这样构造出来的前缀和数组 b 满足 bn = a1 + a1 + …… + an 

    举个例子,原数组 a = {2, 1, 1, 1, 1} 。则 b0 = a0 = 2b1 = b0 + a1 = 2 + 1 = 3b2 = b1 + a2 = 3 + 1 = 4  ……

    以此类推得到 a 的前缀和数组 b = {2, 3, 4, 5, 6}

Q: 前缀和有什么性质?

A: 根据前缀和的简单理解,观察数组前缀和 b ,发现前缀和数组 b 满足 bn = a1 + a2 + …… + an 

    于是,我们对原数组 a 简单预处理后,就能够非常快速的得到原数组 a 任意一段区间 [l, r] 的和,即:  。

    以上文求出的 b = {2, 3, 4, 5, 6} 为例,易见 b4 - b2 = 2 = a3 + a4 。

(……)



现在,小 C 已经完全掌握前缀和的用法,兴奋地手舞足蹈,于是喵喵决定出一道题目来检验一下他的学习成果:

根据喵喵的记录,小 C 从零开始到完全掌握前缀和共用了 t 的时间,喵喵同时记录下了每个时间小 C 增加的掌握值。现在喵喵将记录给你,同时给出了 q 次询问,在每次询问中,喵喵想要知道小 C 从时间 [l, r] 内掌握值增加了多少。

输入

第一行输入两个整数 t, q (  105, 1  105 ) 具体输入含义见题干。

第二行依次输入 t 个整数 a1, a2, ……, at (  ai  105 ) ,第 i 个整数代表在时间 i 增加了多少的掌握值。

接下来 q 行,每行输入两个整数 l, r (  l  r  t ),具体输入含义见题干。

输出

输出多行。

对于每次询问,请在一行输出一个整数,表示答案。

样例输入 Copy
5 2
1 2 3 4 5
1 5
2 4
样例输出 Copy
15
9
提示
注意数据范围喵~
来源/分类