10分求调
查看原帖
10分求调
1190741
Violet_Evergardon楼主2024/8/19 16:19
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
int n,m;
long long a[N],d[N],ta[N];
void build(int s,int t,int p){
	if(s==t){
		d[p]=a[s];
		return ;	
	}
	int m=s+t>>1;
	build(s,m,p*2);build(m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}
long long getsum(int l,int r,int s,int t,int p){
//	cout<<s<<" "<<t<<" "<<p<<" "<<d[p]<<" "<<ta[p]<<endl;
	if(ta[p]){
		d[p]+=(t-s+1)*ta[p];
		if(s!=t) ta[p*2]+=ta[p];ta[p*2+1]+=ta[p];
		ta[p]=0;
	}
	if(l<=s&&t<=r)	return d[p];
	int m=s+t>>1,sum=0;
	if(l<=m)	sum+=getsum(l,r,s,m,p*2);
	if(r>m)		sum+=getsum(l,r,m+1,t,p*2+1);
	return sum;
}
void add(int l,int r,int c,int s,int t,int p){
	if(l<=s&&t<=r){
		d[p]+=(t-s+1)*c;
		ta[p*2]+=c;ta[p*2+1]=c;
		return ;
	}
	if(ta[p]){
		d[p]+=(t-s+1)*c;
		ta[p*2]+=c;ta[p*2+1]=c;
		ta[p]=0;
	}
	int m=s+t>>1;
	if(l<=m)	add(l,r,c,s,m,p*2);
	if(m<r)		add(l,r,c,m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int op,x,y,k;
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			add(x,y,k,1,n,1);
		}
		if(op==2){
			cin>>x>>y;
			cout<<getsum(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/8/19 16:19
加载中...