线段树板题WA#8~18求调qwq
查看原帖
线段树板题WA#8~18求调qwq
177000
vicky2048_2楼主2025/7/27 22:34

rt

#include<bits/stdc++.h>
#define N 100005
#define LL long long
using namespace std;
LL L[N<<2],R[N<<2],num[N<<2],tag[N<<2];
LL a[N<<2];
void add(LL,LL,LL,LL),build(LL,LL,LL),sp(LL);
LL sum(LL,LL,LL);
int main(){
	LL n,m;
	scanf("%lld%lld",&n,&m);
	for(LL i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(LL i=1;i<=m;++i){
		LL z,x,y; LL k;
		scanf("%lld%lld%lld",&z,&x,&y);
		if(z&1){
			scanf("%lld",&k);
			add(1,x,y,k);
		}
		else
			printf("%lld\n",sum(1,x,y)); 
	}
	return 0;
}
void build(LL n,LL l,LL r){
	L[n]=l,R[n]=r;
	if(l==r){
		num[n]=a[l];
		return ;
	}
	LL mi=(l+r)>>1; 
	build(n<<1,l,mi);
	build((n<<1)+1,mi+1,r);
	num[n]=num[n<<1]+num[(n<<1)+1];
	return ;
}
void sp(LL n){
	LL l=L[n],r=R[n],mi=(l+r)>>1,k=tag[n];
	if(k){
		num[n<<1]+=(mi-l+1)*k,tag[n<<1]+=k;
		num[(n<<1)+1]+=(r-mi)*k,tag[(n<<1)+1]+=k;
		tag[n]=0;
	}
	return ;
}
void add(LL n,LL x,LL y,LL k){
	LL l=L[n],r=R[n];
	if(x>r||y<l)
		return ;
	sp(n);
	if(l>=x&&r<=y){
		num[n]+=(r-l+1)*k;
		tag[n]+=k;
		return ;
	}
	add(n<<1,x,y,k);
	add((n<<1)+1,x,y,k);
	num[n]=num[n<<1]+num[(n<<1)+1];
}
LL sum(LL n,LL x,LL y){
	LL l=L[n],r=R[n];
	if(x>r||y<l)
		return 0;
	if(l>=x&&r<=y)
		return num[n];
	sp(n);
	LL su1=sum(n<<1,x,y);
	LL su2=sum((n<<1)+1,x,y);
	num[n]=num[n<<1]+num[(n<<1)+1];
	return su1+su2;
}

2025/7/27 22:34
加载中...