神奇的树状数组,写三个函数过了,这些函数理解也很容易,也可以选择背下来。。
但是,要提醒的是,cin最好全部换成scanf,然后还有RE的。。。
我自己就RE了数回,原因很鬼畜。。
1、不要把数组开太小。。
2、solve函数会把头元素x算进去,所以是solve(x-1)。。。
3、附上代码:
include
using namespace std;
int n,m,x,y,c[500010],a[500010],ch;
int lowbit(int x){
return x&(-x);
} void change(int x,int y){
while(x<=n){
c[x]+=y;
x+=lowbit(x);
}
}
int solve(int x){
int cnt=0;
while(x){
cnt+=c[x];
//cout<<c[x]<<endl;
x-=lowbit(x);
}
return cnt;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),change(i,a[i]);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&ch,&x,&y);
if(ch==1) change(x,y);
else{
printf("%d",solve(y)-solve(x-1));
if(i!=m) puts("");
}
}
return 0;
}