写的线段树,但是写错了,好像是更新时的错误,但是看不出来,求助!
查看原帖
写的线段树,但是写错了,好像是更新时的错误,但是看不出来,求助!
261262
WaltVBAlston楼主2020/10/18 10:55

如题,对于这道题目的样例,第一个输出是对的,第二个输出了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;
}
2020/10/18 10:55
加载中...