一. 题目

image.png

二. 理论

image.png

三. 代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e5+10;

int n, m;

class PrefixAnd
{
public:
    int s[N];//前缀和数组,最初值是原数组值
public:
    PrefixAnd()
    {
        initIO();
    }

    void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    //预处理s数组使其变成前缀和数组
    void initS()
    {
        for(int i=1;i<=n;++i)
            s[i]+=s[i-1];//s[i]=s[i-1]+a[i]
    }

    //得到a[l]到a[r]之间所有数的和
    int getPa(int l, int r)
    {
        return s[r]-s[l-1];
    }
}pa;

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>pa.s[i];

    pa.initS();//预处理前缀和数组
    while(m--)
    {
        int l, r;
        cin>>l>>r;
        cout<<pa.getPa(l, r)<<endl;
    }
}