线段树模板求助
  • 板块灌水区
  • 楼主cmsq958000
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/3/14 19:59
  • 上次更新2024/3/14 21:23:32
查看原帖
线段树模板求助
540818
cmsq958000楼主2024/3/14 19:59
#include<bits/stdc++.h>
using namespace std;

long long n,m;
long long tree[1000005];
long long a[100005];
long long tag[1000005];

void build(long long l,long long r,long long place){
	if(l==r){
		tree[place]=a[l];
		return;
	}
	build(l,l+(r-l)/2,place*2);
	build(l+(r-l)/2+1,r,place*2+1);
	tree[place]=tree[place*2]+tree[place*2+1];
	return;
}
void add(long long l,long long r,long long plus,long long userl,long long userr,long long p){
	if(l<=userl && r>=userr){
		tree[p]+=(userr-userl+1)*plus; tag[p]+=plus;
		return;
	}
	long long mid=userl+(userr-userl)/2;
	if(tag[p] && userl!=userr){
		tree[p*2]+=tag[p]*(mid-userl+1); tree[p*2+1]+=tag[p]*(userr-mid);
		tag[p*2]+=tag[p],tag[p*2+1]+=tag[p];
		tag[p]=0;	
	}
	if(l<=mid) add(l,r,plus,userl,mid,p*2);
	if(r>mid) add(l,r,plus,mid+1,userr,p*2+1);
	tag[p]=tag[p*2]+tag[p*2+1];
	
}

long long query(long long l,long long r,long long userl,long long userr,long long p){
	
	if(l<=userl && r>=userr) return tree[p];
	long long mid=userl+(userr-userl)/2;
	if(tag[p]){
		tree[p*2]+=tag[p]*(mid-userl+1),tree[p*2+1]=tag[p]*(userr-mid);
		tag[p*2]+=tag[p],tag[p*2+1]+=tag[p];
		tag[p]=0;
	}
	long long sum=0; 
	if(l<=mid) sum+=query(l,r,userl,mid,p*2);
	if(r>mid) sum+=query(l,r,mid+1,userr,p*2+1);
	return sum;
	
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,n,1);
	
	for(int i=1;i<=m;i++){
		long long op; scanf("%lld",&op);
		if(op==1){
			long long x,y,k; scanf("%lld %lld %lld",&x,&y,&k);
			add(x,y,k,1,n,1);
		}else if(op==2){
			long long x,y; scanf("%lld %lld",&x,&y);
			cout<<query(x,y,1,n,1)<<"\n";
		}
	}
	
	return 0;
}
2024/3/14 19:59
加载中...