求助
查看原帖
求助
1243205
0720wangyuxiang楼主2025/1/11 19:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N],n,ans,m;
struct node{
	int l;
	int r;
	int data;
	int tag;
}t[4*N];
void build(int L,int R,int i){
	t[i].l=L;
	t[i].r=R;
	if(L==R){
		t[i].data=a[L];
		return;
	}
	int mid=(L+R)/2;
	build(L,mid,i*2);
	build(mid+1,R,i*2+1);
	t[i].data=t[i*2].data+t[i*2+1].data; 
	return ;
}
//int build2(int i){
//	if(t[i].l==t[i].r){
//		t[i].data=a[t[i].l];
//		return t[i].data;
//	}
//	t[i].data=build2(i*2)+build2(i*2+1);
//	return t[i].data;
//}
void spread(int i){
	if(t[i].tag){
		t[i*2].data+=t[i].tag*(t[i*2].r-t[i*2].l+1);
		t[i*2+1].data+=t[i].tag*(t[i*2+1].r-t[i*2+1].l+1);
		t[i*2].tag+=t[i].tag;
		t[i*2+1].tag+=t[i].tag;
		t[i].tag=0;
	}
	return ;
}
void modifty(int i,int L,int R,int k){
	if(L<=t[i].l&&t[i].r<=R){
		t[i].data+=k*(t[i].r-t[i].l+1);
		t[i].tag+=k;
		return ;
	}
	spread(i);
	if(L<=t[i*2].r)modifty(i*2,L,R,k);
	if(t[i*2+1].l<=R)modifty(i*2+1,L,R,k);
	return ;
}
void fnd(int i,int L,int R){
	if(L<=t[i].l&&t[i].r<=R){
		ans+=t[i].data;
		return ;
	}
	spread(i);
	if(L<=t[i*2].r)fnd(i*2,L,R);
	if(t[i*2+1].l<=R)fnd(i*2+1,L,R);
	return ;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	//build2(1);
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		if(x==1){
			int k;
			cin>>k;
			modifty(1,y,z,k);
		}
		else{
			ans=0;
			fnd(1,y,z);
			cout<<ans<<'\n';
		}
	}
	return 0;
}

2025/1/11 19:46
加载中...