这道题是一道树状数组的模板题,主要考察树状数组的单点修改和区间求和的两种基本操作,只要写好对应的函数,按照读入的内容进行操作即可。首先写好lowbit、update、sum函数。因为之前已经写过了这些函数的写法,这里不再陈述。
int lowbit(int x){
return x&(-x);
}
void update(int x,int v){//在序列第x个位置加上a,并在数状数组中修改相关元素
while(x<=n){
c[x]+=v;
x+=lowbit(x);
}
return;
}
int sum(int x){//计算序列第一个位置到第x个位置的区间和
int res=0;
while(x>0){
res+=c[x];
x-=lowbit(x);
}
return res;
}
然后写主函数即可。读入n、m,以及a数组来存储原数组。对树状数组c数组初始化为0,然后依次对a数组中的数进行update操作。接下来对于每一个操作输入k,若k=1,对第a个数进行update操作加b,若k=0,读入a和b,输出sum(b)-sum(a-1)的值即可。
下面是完整代码:
1 #include<cstdio> 2 int c[100005]; 3 int n,m,op,a,b,v,i; 4 int lowbit(int x){ 5 return x&(-x); 6 } 7 void update(int x,int v){//在序列第x个位置加上a,并在数状数组中修改相关元素 8 while(x<=n){ 9 c[x]+=v; 10 x+=lowbit(x); 11 } 12 } 13 void update(int x){ 14 int res=0; 15 while(1){ 16 res+=c[x]; 17 x-=lowbit(x); 18 } 19 return res; 20 } 21 int main(){ 22 scanf("%d %d",&n,&m); 23 for(i=1;i<=n;i++){ 24 scanf("%d",&v); 25 update(i,v); 26 //开始时每个元素初始值为0,读入序列时直接在对应位置加上v即可 27 } 28 for(i=1;i<=m;i++){ 29 scanf("%d %d %d",&op,&a,&b); 30 if(op==0){ 31 printf("%d ",sum(b)-sum(a-1)); 32 }else{ 33 update(a,b); 34 } 35 } 36 return 0; 37 }