本文主要是介绍【树状数组】洛谷_3374 树状数组1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意
如题,已知一个数列,你需要进行下面两种操作:
1.将某一个数加上x
2.求出某区间每一个数的和
思路
用树状数组,然后我们就可以求出它们的前缀和,利用前缀和我们就也可以求出x到y的区间和。
代码
#include<cstdio>
int n,m,tree[500001],z,x,y;
int lowbit(int x)
{return x&-x;
}
void insert(int p,int v)//插入的操作
{for (;p<=n;p+=lowbit(p))tree[p]+=v;
}
int find(int a)//求前缀和的操作
{int o=0;for (;a;a-=lowbit(a)) o+=tree[a];return o;
}
int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++){scanf("%d",&x);insert(i,x);}for (int i=1;i<=m;i++){scanf("%d%d%d",&z,&x,&y);if (z==1) insert(x,y);//放进树状数组里面else printf("%d\n",find(y)-find(x-1));//y的前缀和-(x-1)的前缀和就是x~y的和}
}
这篇关于【树状数组】洛谷_3374 树状数组1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!