一份奇怪的线段树 70pts求调(已开long long)
查看原帖
一份奇怪的线段树 70pts求调(已开long long)
1229005
HuangHuang02983楼主2024/10/23 17:14
#include<bits/stdc++.h>

using namespace std;
long long n,m,x,y,z,op,ans,yuan;
long long tree[400005],laz[400005],ll[400005],rr[400005],a[100005];
void add(long long l,long long r,long long node,long long k){
	if(l<=ll[node]&&r>=rr[node]){
		laz[node]+=k;
		return;
	}
	if(l<=rr[node<<1]){	
		tree[node]+=(min(r,rr[node<<1])-l+1)*k; 
		add(l,min(r,rr[node<<1]),node<<1,k);
	}
	if(r>=ll[(node<<1)|1]){
		tree[node]+=(r-max(ll[(node<<1)|1],l)+1)*k; 
		add(max(ll[(node<<1)|1],l),r,(node<<1)|1,k);
	}
	return;
}
void cha(long long l,long long r,long long node){
	if(l<=ll[node] && r>=rr[node]){
		if(laz[node]!=0){
			tree[node]+=(rr[node]-ll[node]+1)*laz[node];
			laz[node<<1]+=laz[node];
			laz[(node<<1)|1]+=laz[node];
			laz[node]=0;
		}
		ans+=tree[node];
		return;
	}
	if(l<=rr[node<<1]){
		if(laz[node]!=0){
			tree[node]+=(rr[node]-ll[node]+1)*laz[node];
			laz[node<<1]+=laz[node];
			laz[(node<<1)|1]+=laz[node];
			laz[node]=0;
		}
		cha(l,min(r,rr[node<<1]),node<<1);
	}
	if(r>=ll[(node<<1)|1]){
		if(laz[node]!=0){
			tree[node]+=(rr[node]-ll[node]+1)*laz[node];
			laz[node<<1]+=laz[node];
			laz[(node<<1)|1]+=laz[node];
			laz[node]=0;
		}
		cha(max(ll[(node<<1)|1],l),r,(node<<1)|1);
	}
	return;
}
long long dfs(long long l,long long r,long long node){
	if(l==r){
		tree[node]=a[l];
		ll[node]=l;
		rr[node]=r;
		return tree[node];
	}
	tree[node]=dfs(l,(l+r)/2,node<<1)+dfs((l+r)/2+1,r,(node<<1)|1);
	ll[node]=l;
	rr[node]=r;
	return tree[node];
}
void print(){
	for(long long i=1;i<=n*2;i++){
		cout<<tree[i]<<" ";
	}cout<<endl;
	for(long long i=1;i<=n*2;i++){
		cout<<laz[i]<<" ";
	}cout<<endl;
}
signed main(){
	ios::sync_with_stdio(0);
	cout.tie(0);
	cin.tie(0);
    cin>>n>>m;
    for(long long i=1;i<=n;i++)
    scanf("%lld",&a[i]);
	dfs(1,n,1);
	for(long long i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>z;
			add(x,y,1,z);
			//print();
		}
		else{
			cin>>x>>y;
			ans=0;
			cha(x,y,1);
			//print();
			cout<<ans<<'\n';
		}
	}
	return 0;
}
2024/10/23 17:14
加载中...