P3372求助
  • 板块灌水区
  • 楼主funeral
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/22 19:05
  • 上次更新2023/11/22 21:10:40
查看原帖
P3372求助
1024189
funeral楼主2023/11/22 19:05

题

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[4000005];
int e,x,y,k;
int d[4000005];

void build(int s,int t,int p){
	if(s==t){
		d[p]=a[s];
		return;
	}
	int m=s+((t-s)>>1);
	
	build(s,m,p*2);
	build(m+1,t,p*2+1);
	
	d[p]=d[p*2]+d[p*2+1];
}

int ssum(int l,int r,int s,int t,int p){
	
//	cout<<1<<endl;
	if(l<=s&&t<=r){
		return d[p];
	}
	int sum=0;
	int m=s+((t-s)>>1);
	
	if(l<=m)sum+=ssum(l,r,s,m,p*2);
	if(r>m)sum+=ssum(l,r,m+1,t,p*2+1);
	
	return sum;
}

int b[4000005];
void uqdate(int l,int r,int c,int s,int t,int p){
//	
//	cout<<1<<endl;
	
	if(l<=s&&t<=r){
		
		d[p]+=(t-s+1)*c;
		b[p]+=c;
		
		return;
	}
	
	int m=s+((t-s)>>1);
	if(b[p]&&s!=t){
		d[p*2]+=b[p]*(m-s+1);
		d[p*2+1]+=b[p]*(t-m);
		
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		
		b[p]=0;
	}
	
	if(l<=m)uqdate(l,r,c,s,m,p*2);
	if(r>m)uqdate(l,r,c,m+1,t,p*2+1);
	
	d[p]=d[p*2]+d[p*2+1];
}


signed main(){
	int n,u;
	cin>>n>>u;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=u;i++){
		cin>>e;
		if(e==1){
			cin>>x>>y>>k;
			uqdate(x,y,k,1,n,1);
		}else{
			cin>>x>>y;
			cout<<ssum(x,y,1,n,1)<<endl;
		}
		
	}
	return 0;
}
2023/11/22 19:05
加载中...