练习.树状数组
第一题
#include<stdio.h>
int a[500100];
int lowbit(int x){
return x&(-x);
}
void add(int x,int v,int n){
while(x<=n){
a[x]=a[x]+v;
x=x+lowbit(x);
}
}
int all(int ai,int bi){
int bigall = 0;
int smallall = 0;
ai=ai-1;
while(ai){
smallall+=a[ai];
ai -=lowbit(ai);
}
while(bi){
bigall+=a[bi];
bi-=lowbit(bi);
}
return bigall-smallall;
}
int main()
{
int n,t;
scanf("%d %d",&n,&t);
for(int i=1;i<=n;i++){
int u;
scanf("%d",&u);
add(i,u,n);
}
for(int h=0;h<t;h++){
int key,b,c;
scanf("%d %d %d",&key,&b,&c);
if(key==1){
add(b,c,n);
}else if(key==2){
printf("%d\n",all(b,c));
}
}
return 0;
}
第二题
#include<stdio.h>
int a[500100];
int lowbit(int x){
return x&(-x);
}
void add(int x,int v,int n){
while(x<=n){
a[x]=a[x]+v;
x=x+lowbit(x);
}
}
int getsum(int i){
int all = 0;
while(i > 0){
all += a[i];
i -= lowbit(i);
}
return all;
}
int main()
{
int n,t;
scanf("%d %d",&n,&t);
int last = 0;
for(int i=1;i<=n;i++){
int u;
scanf("%d",&u);
add(i,u-last,n);
last = u;
}
for(int h=0;h<t;h++){
int key;
scanf("%d",&key);
if(key==1){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(x,k,n);
add(y+1,-k,n);
}else if(key==2){
int kk;
scanf("%d",&kk);
printf("%d\n",getsum(kk));
}
}
return 0;
}