10pts玄关求调
查看原帖
10pts玄关求调
807667
JenF楼主2024/8/5 15:54
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,type,x,y,kk,st[4*N],a[N],tag[4*N];
void build(int s,int t,int k){
	if(s==t){
		st[k]=a[s];
		return ;
	}
	int mid=s+(t-s)/2;
	build(s,mid,2*k);
	build(mid+1,t,2*k+1);
	st[k]=st[k*2]+st[k*2+1];
	return ;
}
void update(int l,int r,int s,int t,int k,int num){
	if(l<=s&&t<=r){
		st[k]+=(t-s+1)*num,tag[k]=num;
		return ;
	}
	if(l>t||r<s) return ;
	int mid=s+(t-s)/2;
	if(tag[k]&&s!=t){
		st[k*2]+=tag[k]*(mid-s+1);
		st[k*2+1]+=tag[k]*(t-mid);
		tag[k*2]+=tag[k];
		tag[k*2+1]+=tag[k];
		tag[k]=0;
	}
	if(l<=mid) update(l,r,s,mid,k*2,num);
	if(r>mid) update(l,r,mid+1,t,k*2+1,num);
	st[k]=st[k*2]+st[k*2+1];
	return ;
} 
int getsum(int l,int r,int s,int t,int k){
	if(l<=s&&r>=t){
		return st[k];
	}
	if(l>t||r<s) return 0;

	int mid=s+(t-s)/2;
	if(tag[k]&&s!=t){
		st[k*2]+=tag[k]*(mid-s+1);
		tag[k*2]+=tag[k];
		st[k*2+1]+=tag[k]*(t-mid);
		tag[k*2+1]+=tag[k];
		tag[k]=0;
	}
	int res=0;
	if(l<=mid) res+=getsum(l,r,s,mid,k*2);
	if(r>mid) res+=getsum(l,r,mid+1,t,k*2+1);
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	while(m--){
		cin>>type;
		if(type==1){
			cin>>x>>y>>kk;
			update(x,y,1,n,1,kk);
		}else{
			cin>>x>>y;
			cout<<getsum(x,y,1,n,1)<<endl;
		}
	}
	return 0;
} 
2024/8/5 15:54
加载中...