70pts求助
查看原帖
70pts求助
752102
leilei1楼主2024/10/10 21:43
#include<bits/stdc++.h>
using namespace std;

long long n,m,a[100005],d[400000],f[40000];

int read(){
	long long res=0;
	long long fl=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') fl=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		res=res*10+ch-'0';
		ch=getchar();
	}
	return fl*res;
}

void build(int l,int r,int p){
	if(l==r){
		d[p]=a[l];
		return;
	}
	long long num=l+((r-l)>>1);
	build(l,num,p*2);
	build(num+1,r,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}

int getsum(int l,int r,int s,int t,int p){
	if(l<=s&&r>=t){
		return d[p];
	}
	long long num=s+((t-s)>>1);
	if(f[p]){
		d[2*p]+=(num-s+1)*f[p];
		d[2*p+1]+=(t-num)*f[p];
		f[2*p]+=f[p];
		f[2*p+1]+=f[p];
		f[p]=0;
	}
	int cnt=0;
	if(l<=num) cnt+=getsum(l,r,s,num,p*2);
	if(r>num) cnt+=getsum(l,r,num+1,t,p*2+1);
	return cnt;
}

void uplate(int l,int r,int k,int s,int t,int p){
	if(l<=s&&r>=t){
		d[p]+=(t-s+1)*k,f[p]+=k;
		return;
	}
	long long num=s+((t-s)>>1);
	if(f[p]&&s!=t){
		d[2*p]+=(num-s+1)*f[p];
		d[2*p+1]+=(t-num)*f[p];
		f[2*p]+=f[p];
		f[2*p+1]+=f[p];
		f[p]=0;
	}
	if(l<=num) uplate(l,r,k,s,num,p*2);
	if(r>num) uplate(l,r,k,num+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}

int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,n,1);
	for(int i=1;i<=m;i++){
		long long g,x,y,c;
		g=read(),x=read(),y=read();
		if(g==1){
			c=read();
			uplate(x,y,c,1,n,1);
		}
		else{
			cout<<getsum(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/10/10 21:43
加载中...