线段树不能读入完
查看原帖
线段树不能读入完
673348
tiankong153楼主2023/10/10 17:29
#include<bits/stdc++.h>
using namespace std;
long long d[40008],add[40008];
int n,m;
int a,b,flag;
long long c;
void build(int k,int l,int r){
	if(l==r){
		scanf("%lld%",&d[k]);
		return;
	}
	int mid=l+((r-l)>>1);
	build(2*k,l,mid),build(2*k+1,mid+1,r);
	d[k]=d[k*2]+d[k*2+1];
}
void Add(int k,int l,int r,int v){
	add[k]+=v;
	d[k]+=(r-l+1)*v;
	return;
}
void pushdown(int k,int l,int r,int mid){
	if(add[k]!=0){
		d[k*2]+=add[k]*(mid-l+1);
		d[k*2+1]+=add[k]*(r-mid);
		add[k*2]+=add[k];
		add[k*2+1]+=add[k];
		add[k]=0;
	}
}
void change(int k,int l,int r,int x,int y,int v){
	if(l>r)
	return;            
	if(x<=l&&y>=r)Add(k,l,r,v);
	int mid=(l+r)>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)change(2*k,l,mid,x,y,v);
	if(y>mid)change(2*k+1,mid+1,r,x,y,v);
	d[k]=d[k*2]+d[k*2+1];
}
long long getsum(int k,int l,int r,int x,int y){
	if(x<=l&&y>=r)return d[k];
	int mid=(l+r)>>1;
	long long res=0;
	if(x<=mid)res+=getsum(2*k,l,mid,x,y);
	if(y>mid)res+=getsum(2*k+1,mid+1,r,x,y);
	return res;
}
int main(){
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&flag,&a,&b);
		if(flag==1){
			scanf("%lld",&c);
			change(1,1,n,a,b,c);
		}
		if(flag==2)
		printf("%lld\n",getsum(1,1,n,a,b));
	}
	return 0;
}

各位神犇们真的改不出来了

运行有问题

2023/10/10 17:29
加载中...