题目来源
洛谷P3374【模板】树状数组1
https://www.luogu.org/problem/show?pid=3374
思路
树状数组模板题
代码(C++)
#include <cstdio>
int n,m,c,x,y;
long long k,num[500010];
inline int lowbit(int w);
inline long long ask(int pos);
inline void add(long long sum,int pos);
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lld",&num[i]);
for(int i=n;i>=1;--i)
k=num[i],num[i]=0,add(k,i);
for(int i=1;i<=m;++i)
{
scanf("%d",&c);
if(c==1)
{
scanf("%d%lld",&x,&k);
add(k,x);
}
else
{
scanf("%d%d",&x,&y);
printf("%lld\n",ask(y)-ask(x-1));
}
}
return 0;
}
inline long long ask(int pos)
{
long long sum=0;
while(pos>0)
{
sum+=num[pos];
pos-=lowbit(pos);
}
return sum;
}
inline void add(long long sum,int pos)
{
while(pos<=n)
{
num[pos]+=sum;
pos+=lowbit(pos);
}
}
inline int lowbit(int w)
{
return w&(-w);
}