help
查看原帖
help
338147
01bit楼主2021/2/5 23:13
#include<cstdio>
#define ll long long
using namespace std;
int d[1000001],b[1000001];
ll n,m,a[100001];
void build(ll l,ll r,ll p){
	if(l==r){d[p]=a[l];return;}
	ll m=(l+r)>>1;
	build(l,m,p<<1);
	build(m+1,r,(p<<1)+1);
	d[p]=d[p<<1]+d[(p<<1)+1];
}
void add(ll l1,ll r1,ll l2,ll r2,ll c,ll p){
	if(l1<=l2&&r2<=r1){d[p]+=(r2-l2+1)*c,b[p]+=c;return;}
	ll m=(l2+r2)>>1;
	if(b[p]&&l2!=r2){
		d[p<<1]+=(m-l2+1)*b[p],d[(p<<1)+1]+=(r2-m)*b[p];
		b[p<<1]=b[p],b[(p<<1)+1]=b[p],b[p]=0;
	}
	if(l1<=m)add(l1,r1,l2,m,c,p<<1);
	if(m<r1)add(l1,r1,m+1,r2,c,(p<<1)+1);
	d[p]=d[p<<1]+d[(p<<1)+1];
}
ll get(ll l1,ll r1,ll l2,ll r2,ll p){
	if(l1<=l2&&r2<=r1)return d[p];
	ll m=(l2+r2)>>1;
	if(b[p]&&l2!=r2){
		d[p<<1]+=(m-l2+1)*b[p],d[(p<<1)+1]+=(r2-m)*b[p];
		b[p<<1]=b[p],b[(p<<1)+1]=b[p],b[p]=0;
	}
	ll sum=0;
	if(l1<=m)sum+=get(l1,r1,l2,m,p<<1);
	if(m<r1)sum+=get(l1,r1,m+1,r2,(p<<1)+1);
	return sum;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i)scanf("%lld",a+i);
	build(1,n,1);
	while(m--){
		int op;
		scanf("%d",&op);
		if(op==1){
			ll x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(x,y,1,n,k,1);
		}else{
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",get(x,y,1,n,1));
		}
	}
	return 0;
}
2021/2/5 23:13
加载中...