求助
查看原帖
求助
275090
Albet楼主2021/1/3 16:00
#include<iostream>
using namespace std;
const int N=100010;
long long ts[N<<2],tl[N<<2],tr[N<<2],tmid[N<<2],l_t[N<<2],a[N];
long long num(int rt){
	return tr[rt]-tl[rt]+1;
}
void push_up(long long rt){
	ts[rt]=ts[rt<<1]+ts[rt<<1|1];
	return;
}
void push_down(long long rt){
	l_t[rt<<1]+=l_t[rt];
	l_t[rt<<1|1]+=l_t[rt];
	ts[rt<<1]=l_t[rt]*num(rt<<1);
	ts[rt<<1|1]=l_t[rt]*num(rt<<1|1);
	l_t[rt]=0;
	return;
}
void build(long long l,long long r,long long rt){
	long long mid=(l+r)>>1;
	tl[rt]=l;tr[rt]=r;tmid[rt]=mid;
	if(l==r){
		ts[rt]=a[l];
		return;
	}
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	push_up(rt);
	return;
}
void add(long long l,long long r,long long k,long long rt){
	if(l<=tl[rt] && tr[rt]<=r){
		ts[rt]+=k*num(rt); 
		l_t[rt]+=k;
		return;
	}
	push_down(rt);
	if(l<=tmid[rt]){
		add(l,tmid[rt],k,rt<<1);
	}
	if(r>tmid[rt]){
		add(tmid[rt]+1,r,k,rt<<1|1);
	}
}
long long query(long long l,long long r,long long rt){
	if(l<=tl[rt] && tr[rt]<=r){
		return ts[rt];
	}
	push_down(rt);
	long long sum=0;
	if(l<=tmid[rt]){
		sum+=query(l,tmid[rt],rt<<1);
	}
	if(r>tmid[rt]){
		sum+=query(tmid[rt]+1,r,rt<<1|1);
	}
	return sum;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	long long op,x,y,k;
	while(m--){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			add(x,y,k,1);
		}else{
			cin>>x>>y;
			cout<<query(x,y,1);
		}
	}
	return 0;
}
2021/1/3 16:00
加载中...