AcWing 1264. 动态求连续区间和
这个是树状数组的两个操作:1.单点修改 2.区间 求前缀和
tr[i]=c[i]
初始化原数组
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],tr[N];
int n,m;
int lowbit(int x)//求出2^k,得到tr[i] = (x-2^k,x]
{
return 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;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]);
while(m--){
int k,a,b;
scanf("%d%d%d",&k,&a,&b);
//k=0 ,表示求子数列[a,b]的和;k=1,表示第 a 个数加 b
if(k==0)printf("%d\n",query(b)-query(a-1));
else add(a,b);
}
return 0;
}