51nod1081 子段求和(前缀和)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxiyulu/article/details/77618788
/*
树状数组求前缀和
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn=5e4+5;
int n,q;
int pos,l;
LL bit[maxn];
LL sum(int i)
{
    LL s=0;
    while(i>0)
    {
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
void add(int i,int x)
{
    while(i<=n)
    {
        bit[i]+=x;
        i+=i&-i;
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        int x;
        memset(bit,0,sizeof(bit));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            add(i,x);
        }
        scanf("%d",&q);
        for(int i=0;i<q;i++)
        {
            scanf("%d%d",&pos,&l);
            printf("%I64d\n",sum(pos+l-1)-sum(pos-1));
        }
    }
    return 0;
}
/*
前缀和
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn=5e4+5;
int n,q;
int pos,l;
LL sum[maxn];

int main()
{
    while(~scanf("%d",&n))
    {
        int x;
        sum[0]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            sum[i]=sum[i-1]+x;
        }
        scanf("%d",&q);
        for(int i=0;i<q;i++)
        {
            scanf("%d%d",&pos,&l);
            printf("%I64d\n",sum[pos+l-1]-sum[pos-1]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhuxiyulu/article/details/77618788
今日推荐