前缀和

输入一个长度为 n 的整数序列。

接下来再输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式

第一行包含两个整数 n和 m。

第二行包含 n个整数,表示整数数列。

接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。

输出格式

共 m行,每行输出一个询问的结果。

数据范围

1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000

输入样例:

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

输出样例:

1
2
3
3
6
10

前缀和模板题。

前缀和数组s[i]表示a[1]+...+a[i-1](这个题下标从1开始)

[l,r]的区间和等于a[1]+...a[l-1]+a[l]+...+a[r]-(a[1]+...+a[l-1])也就是s[r+1]-s[l]

构造前缀和数组是线性时间复杂度,每次查询是常数时间复杂度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<vector>
using namespace std;


int main(){
int n,m;
cin>>n>>m;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
vector<int> s(n+2,0);
for(int i=1;i<=n+1;i++){
s[i]=s[i-1]+a[i-1];
}
while(m--){
int l,r;
cin>>l>>r;
cout<<s[r+1]-s[l]<<endl;
}
return 0;
}