如题,对于这道题目的样例,第一个输出是对的,第二个输出了12,玄学
#include<cstdio>
int n,p,t,x,y,k,a[500005],tree[2000005];
void build(int node,int start,int end){
if(start==end){
tree[node]=a[start];
return;
}
int mid=(start+end)/2;
int left=2*node,right=2*node+1;
build(left,start,mid);
build(right,mid+1,end);
tree[node]=tree[left]+tree[right];
return;
}
void update(int node,int start,int end,int idx,int val){
if(start==end){
a[idx]+=val;
tree[node]+=val;
return;
}
int left=2*node,right=2*node+1;
int mid=(start+end)/2;
if(idx>=start&&idx<=mid)
update(left,start,mid,idx,val);
else if(idx>=mid+1&&idx<=end)
update(right,mid+1,end,idx,val);
tree[node]=tree[left]+tree[right];
return;
}
int query(int node,int start,int end,int L,int R){
if(start>R||end<L)
return 0;
//printf("%d %d\n",start,end);
if(start==end)
return tree[node];
else if(start>=L&&end<=R)
return tree[node];
int mid=(start+end)/2;
int left=2*node,right=2*node+1;
tree[node]=query(left,start,mid,L,R)+query(right,mid+1,end,L,R);
return tree[node];
}
int main(){
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
while(p--){
scanf("%d",&t);
if(t==1){
scanf("%d%d",&x,&k);
update(1,1,n,x,k);
/*
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
*/
}
else{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y));
}
}
return 0;
}