社区讨论

P3372求调

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m692ojev
此快照首次捕获于
2025/01/23 16:30
去年
此快照最后确认于
2025/11/04 10:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,a[10100000],x,y,k,z[10100000],t[10100000];
void down(ll d,ll l,ll r){
	if(z[d]){
		ll q=d*2,w=d*2+1,f=(l+r)/2;
		z[q]+=z[d];
		z[w]+=z[d];
		t[q]+=z[d]*(f-l+1);
		t[w]+=z[d]*(r-f);
		z[d]=0; 
	}
}
void qw(ll d,ll l,ll r){
	if(r==l){
		t[d]=a[l];
		return;
	}
	ll f=(l+r)/2;
	qw(d*2,l,f);
	qw(d*2+1,f+1,r);
	t[d]=t[d*2]+t[d*2+1];
}
void lazy(ll d,ll l,ll r){
	ll f=(l+r)/2;
	if(x<=l&&r<=y){
		z[d]+=k;
		t[d]+=k*(r-l+1);
		return;
	}
	down(d,l,r);
	if(x<=f){
		lazy(d*2,l,f);
	}
	if(f<y){
		lazy(d*2+1,f+1,r);
	}
	t[d]=t[d*2]+t[d*2+1];
}
ll findl(ll d,ll l,ll r){
	ll s=0;
	if(x<=l&&r<=y){
		return t[d];
	}
	ll f=(l+r)/2;
	//cout<<x<<" "<<f;
	if(x<=f){
		s+=findl(d*2,l,f);
		
	}
	if(f<y){
		s+=findl(d*2+1,f+1,r);
	}
	return s;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	qw(1,1,n);
	for(int o=1;o<=m;o++){
		ll q;
		scanf("%lld%lld%lld",&q,&x,&y);
		if(q==1){
			scanf("%lld",&k);
			lazy(1,1,n);
		}
		else{
			printf("%lld\n",findl(1,1,n));
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...