#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

/*
设前 i 个数字的和为:s[i]
    s[1] = a[1];
    s[2] = a[1] + a[2];
    s[3] = a[1] + a[2] + a[3];
    s[4] = a[1] + a[2] + a[3] + a[4];
    s[5] = a[1] + a[2] + a[3] + a[4] + a[5];

求区间 [3, 5] 的和
    s[5] - s[2]

求区间 [10, 100] 的和
    s[100] = a[1] + a[2] + ... + a[100];
    a[10] + a[11] + a[12] + ... + a[100];
        s[100] 相比于区间[10, 100],多了a[1]+a[2]+...+a[9]
        s[100] - s[9]

求区间 [l, r] 的和
    s[r] - s[l-1];
    [1, r]的和 - [1, l-1]的和

怎么能快速求出 数组 s
    s[1] = a[1];
    s[2] = a[1] + a[2];
    s[3] = a[1] + a[2] + a[3];
    s[4] = a[1] + a[2] + a[3] + a[4];
    s[5] = a[1] + a[2] + a[3] + a[4] + a[5];
    s[2] 比 s[1]多了一个 a[2]
        s[2] = s[1] + a[2]
    s[3] 比 s[2]多了一个 a[3]
        s[3] = s[2] + a[3]
    s[4] 比 s[3]多了一个 a[4]
        s[4] = s[3] + a[4]
    s[5] 比 s[4]多了一个 a[5]
        s[5] = s[4] + a[5]
    s[i] 比 s[i-1] 多了一个 a[i]
        s[i] = s[i-1] + a[i]
    
    for(int i = 1; i <= n; i ++ ){
        s[i] = s[i-1] + a[i];
    }
*/

int n, m;
int a[N], s[N];

int main(){
    
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ ){
        cin >> a[i];
        s[i] = s[i-1] + a[i];
    }

    while(m -- ){
        int l, r;
        cin >> l >> r;

        cout << s[r] - s[l-1] << '\n';
    }
    
    return 0;
}

1 条评论

  • 1