萌新求助树状数组
查看原帖
萌新求助树状数组
661595
a2lyaXNhbWUgbWFyaXNh楼主2022/10/3 13:22

根据 这篇博客 写的区间修改、区间查询

但是样例没过,求调

#include<cstdio>
typedef unsigned long long ULL;
ULL tree1[100005],tree2[100005],n,m,tmp1,tmp2;
inline void update(ULL *TREE,ULL pos,ULL value){
	while(pos<=n){
		TREE[pos]+=value;
		pos+=pos&(-pos);
	}
}
inline ULL getsum(ULL *TREE,ULL pos){
	ULL sum;
	while(pos>0){
		sum+=TREE[pos];
		pos-=pos&(-pos);
	}
	return sum;
}
int main(){
	scanf("%llu%llu",&n,&m);
	for(ULL i=1;i<=n;i++){
		scanf("%llu",&tmp1);
		tmp2=tmp1-tmp2;
		update(tree1,i,tmp2);
		update(tree2,i,(i-1)*tmp2);
		tmp2=tmp1;
	}
	ULL opt,x,y,z;
	while(m--){
		scanf("%llu",&opt);
		if(opt==1){
			scanf("%llu%llu%llu",&x,&y,&z);
			update(tree1,x,z);
			update(tree1,y+1,-z);
			update(tree2,x,z*(x-1));
			update(tree2,y+1,-z*y);
		}else{
			scanf("%llu%llu",&x,&y);
			printf("%llu\n",(y*getsum(tree1,y)-(x-1)*getsum(tree1,x-1))-(getsum(tree2,y)-getsum(tree2,x-1)));
		}
	}
	return 0;
}
2022/10/3 13:22
加载中...