10pts求调
查看原帖
10pts求调
950426
aVSCode楼主2025/1/1 14:06
#include<iostream>
#include<cmath>
using namespace std;
#define int long long
long long a[100005],t[400005],tag[400005];
void build(int l,int r,int now){
	if(l==r) t[now]=a[l];
	else{
		int mid=(l+r)>>1;
		build(l,mid,now*2);
		build(mid+1,r,now*2+1);
		t[now]=t[now*2]+t[now*2+1];
	}
}
void push_down(int l,int r,int now){
	int mid=(l+r)>>1;
	t[now*2]+=(mid-l+1)*tag[now];
	tag[now*2]=tag[now];
	t[now*2+1]+=(r-mid)*tag[now];
	tag[now*2+1]=tag[now];
}
long long find(int l,int r,int o,int p,int now){
	if(l<=o&&r>=p) return t[now];//[o,p]e[l,r]
	else{
		if(tag[now]!=0){
			push_down(o,p,now);//tag下放
			tag[now]=0;
		}
		int mid=(o+p)>>1;
		long long res=0;
		if(mid>=l) res+=find(l,r,o,mid,now*2);
		if(mid<r) res+=find(l,r,mid+1,p,now*2+1);
		return res;
	}
}
void add(int l,int r,int o,int p,long long num,int now){
	// cout<<o<<" "<<p<<" "<<now<<" "<<tag[now]<<endl;
	if(l<=o&&p<=r){
		// cout<<"Executed"<<endl;
		t[now]+=(p-o+1)*num;
		tag[now]=num;
		// cout<<o<<" "<<p<<" "<<now<<" "<<t[now]<<endl;
	}
	else{
		if(tag[now]!=0){
			push_down(o,p,now);
			tag[now]=0;
		}
		int mid=(o+p)>>1;
		if(mid>=l) add(l,r,o,mid,num,now*2);
		if(mid<r) add(l,r,mid+1,p,num,now*2+1);
		t[now]=t[now*2]+t[now*2+1];
	}
	// cout<<o<<" "<<p<<" "<<now<<" "<<tag[now]<<endl;
}
int n,m,op;
long long x,y,k;
signed 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++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			add(x,y,1,n,k,1);
		}
		if(op==2){
			cin>>x>>y;
			cout<<find(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2025/1/1 14:06
加载中...