3re求助
查看原帖
3re求助
218752
smy2006楼主2021/9/26 19:20
#include<iostream>
#include<cmath>
using namespace std;
//线段树
long long tre[100010],arr[100010],ad[100010],temp;
long long n,m,a,b,k;
inline void build(long long l,long long r,long long p){
	if(l==r){
		tre[p]=arr[l];
		return;
	}
	int mid=l+((r-l)>>1);
	build(l,mid,p*2);build(mid+1,r,p*2+1);
	tre[p]=tre[p*2]+tre[p*2+1];
	return;
}
inline void tr_add_(long long l,long long r,long long p){
	if(l==r){
		ad[p]+=k;return;
	}
	int mid=l+((r-l)>>1);
	ad[p]+=k*(min(r,b)-max(l,a)+1);
	if(a<=mid){
		tr_add_(l,mid,p*2);
	}
	if(b>mid){
		tr_add_(mid+1,r,p*2+1);
	}
	return;
}
inline long long find(long long l,long long r,long long p){
	if(l==r) {return (tre[p]+ad[p]);}
	int mid=l+((r-l)>>1);
	long long cnt=0;
	if(a<=mid){
		cnt+=find(l,mid,p*2);
	}
	if(b>mid){
		cnt+=find(mid+1,r,p*2+1);
	}
	return cnt;
}
int main(){
	cin>>n>>m;
	for(int i=1; i<=n; i++){
		cin>>arr[i];
	}
	build(1,n,1);
	for(int i=1; i<=m; i++){
		cin>>temp;
		if(temp==1){
			cin>>a>>b>>k;
			tr_add_(1,n,1);
		}else{
			cin>>a>>b;
			cout<<find(1,n,1)<<endl;
		}
	}
} 
2021/9/26 19:20
加载中...