题意
如题,已知一个数列,你需要进行下面两种操作:
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的和
}
}