数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
思路:对于一个数组a,如果对于m个测试数据都采用循环求[l , r ]的区间和的话就极易超时。而这个时候我们可以另开一个数组来存前缀和就可以巧妙的解决这个问题了。其实前缀和就是sum[ i ] = a[ 1 ] + a[ 2 ] + ······+a[ i ];而很显然对于[l , r ]的区间和就可以直接由sum [r ] - sum[ l - 1 ]得到啦。
代码实现:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e6+5;
int a[MAXN];
ll sum[MAXN];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
ll n, m;
cin >> n >> m;
for(int i = 1; i <= n; i ++ ){
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
while(m -- ){
ll l, r;
cin >> l >> r;
cout << sum[r] - sum[l - 1] << endl;
}
return 0;
}