1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)

题目:

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)_第1张图片

输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
输出样例:
11
30
35

 树状数组:

1264. 动态求连续区间和(树状数组---某个位置加上一个数/求在线(动态)前缀和/蓝桥杯)_第2张图片

代码:

#include
#include
using namespace std;

const int N=100010;
int n,m;
int a[N],tr[N];

//2^k
int lowbit(int x)
{
    return x&-x;
}

//改变数组在位置x上的值(加上某个值)
void add(int x,int v)
{
    for(int i=x;i<=n;i+=lowbit(i))tr[i]+=v;
}

//求动态(在线)前缀和
int query(int x)
{
    int res=0;
    for(int i=x;i>0;i-=lowbit(i))res+=tr[i];
    return res;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)add(i,a[i]);//求得tr[i]
    
    while(m--){
        int k,a,b;
        scanf("%d%d%d",&k,&a,&b);
        if(k==1)add(a,b);
        else
        printf("%d\n",query(b)-query(a-1));//在线区间和
    }
    return 0;
}

你可能感兴趣的:(模拟,前缀和,算法,蓝桥杯)