蒟蒻线段树RE求助
查看原帖
蒟蒻线段树RE求助
372219
PeyNiKge楼主2021/10/5 16:24
#include<stdio.h>
using namespace std; 
long long n,m;
long long sum[1000000];
long long bj[100000];
void jt(long long l,long long r,long long rt){
	if(l==r){
		scanf("%d",&sum[rt]);
		return;
	}
	long long m=(l+r)>>1;
	jt(l,m,rt<<1);
	jt(m+1,r,rt<<1|1);
	sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 
	return;
}
void f(long long l,long long r,long long rt,long long k){
	bj[rt]+=k;
	sum[rt]+=k*(r-l+1);
	return;
}
void push_down(long long l,long long r,long long rt){
	long long m=(l+r)>>1;
	f(l,m,rt<<1,bj[rt]);
	f(m+1,r,rt<<1|1,bj[rt]);
	bj[rt]=0;
	return;
}
long long cx(long long l,long long r,long long rt,long long x,long long y){
	if(l>=x&&r<=y){
		return sum[rt];
	} 
	long long m=(l+r)>>1;
	push_down(l,r,rt);
	long long ans=0;
	if(m>=x) ans+=cx(l,m,rt<<1,x,y);
	if(m<y) ans+=cx(m+1,r,rt<<1|1,x,y);
	return ans;
}
void xg(long long l,long long r,long long rt,long long x,long long y,long long z){
	if(l>=x&&r<=y){
		sum[rt]+=(r-l+1)*z;
		bj[rt]+=z; 
		return;
	}
	push_down(l,r,rt);
	long long m=(l+r)>>1;
	if(m>=x) xg(l,m,rt<<1,x,y,z);
	if(m<y) xg(m+1,r,rt<<1|1,x,y,z);
	sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	jt(1,n,1);
	long long x,y,z,s;
	for(long long i=1;i<=m;i++){
		scanf("%d%d%d",&s,&x,&y);
		if(s==1){
			scanf("%d",&z);
			xg(1,n,1,x,y,z);
		}
		else{
			printf("%d\n",cx(1,n,1,x,y));
		}
	}
	return 0;
}
2021/10/5 16:24
加载中...