WA70分求调
查看原帖
WA70分求调
1273558
Flax_shiep楼主2024/8/25 11:33
#include<cstdio>
using namespace std;
#define int long long
int a[400040],n,m,d[400040],t[400040],x,y,z;
int ans;
void add(int x,int y,int z){
	if(x==y){
		d[z]=a[x];
		return;
	}
	int p=((y-x)>>1)+x;
	add(x,p,z<<1);
	add(p+1,y,(z<<1)+1);
	d[z]=d[z<<1]+d[(z<<1)+1];
}
void c(int x,int y,int a,int b,int z){
	if(t[z]!=0){
		d[z]+=t[z]*(b-a+1);
		t[z*2]+=t[z];
		t[z*2+1]+=t[z];
		t[z]=0;
	}
	if(a>=x&&b<=y){
		ans+=d[z];
		return;
	}
	if(b<x||a>y)return;
	int p=((b-a)>>1)+a;
	c(x,y,a,p,z*2);
	c(x,y,p+1,b,z*2+1);
}
void v(int x,int y,int a,int b,int z,int k){
	if(a>=x&&b<=y){
		t[z]+=k;
		return;
	}
	if(b<x||a>y)return;
	if(b>y&&a<x){
		d[z]+=(y-x+1)*k;
	}
	else if(b>y){
		d[z]+=(y-a+1)*k;
	}
	else{
		d[z]+=(b-x+1)*k;
	}
	int p=((b-a)>>1)+a;
	v(x,y,a,p,z*2,k);
	v(x,y,p+1,b,z*2+1,k);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	add(1,n,1);
	while(m--){
		scanf("%lld",&x);
		if(x==2){
			ans=0;
			scanf("%lld%lld",&x,&y);
			c(x,y,1,n,1);
			printf("%lld\n",ans);
			
		}
		else{
			scanf("%lld%lld%lld",&x,&y,&z);
			v(x,y,1,n,1,z);
		}
	}
    return 0;
}
2024/8/25 11:33
加载中...