大佬们帮忙看看
查看原帖
大佬们帮忙看看
1163927
F1NE楼主2024/9/25 20:24
#include<bits/stdc++.h>
#define ll long long
#define getm int m=(s+t)>>1
#define ls p<<1
#define rs (p<<1)|1
#define update sgt[p]=sgt[ls]+sgt[rs]
#define pushdown \
	if(laz[p]){\
		laz[ls]+=laz[p],laz[rs]+=laz[p];\
		sgt[ls]+=laz[p]*(m-s+1),sgt[rs]+=laz[p]*(t-m);\
		laz[p]=0;\
	}
#define if_in if(l<=s&&t<=r)
#define if_l if(l<=m)
#define if_r if(m<r)
#define goto_l l,r,s,m,ls
#define goto_r l,r,m+1,t,rs
using namespace std;
const int maxi=1e5+9;
int N,M;
ll a[maxi],sgt[maxi<<2],laz[maxi<<2];
ll rd(int l,int r,int s,int t,int p){
	if_in return sgt[p];
	getm;ll ans=0;
	pushdown;
	if_l ans+=rd(goto_l);
	if_r ans+=rd(goto_r);
	update;
	return ans;
}
void wt(int l,int r,int s,int t,int p,int x){
	if_in{
		sgt[p]+=x*(t-s+1),laz[p]+=x;return;
	}
	getm;
	pushdown;
	if_l wt(goto_l,x);
	if_r wt(goto_r,x);
	update;
	return;
}
void build(int s,int t,int p){
	if(s==t)sgt[p]=a[s];
	getm;
	build(s,m,ls),build(m+1,t,rs);
	update;
	return;
}
int main(){
	cin>>N>>M;
	for(int i=1;i<=N;i++)scanf("%lld",&a[i]); 
	for(int i=1,x,y,k,op;i<=M;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&x,&y,&k);
			wt(x,y,1,N,1,k);
		}
		if(op==2){
			scanf("%d%d",&x,&y);
			printf("%lld\n",rd(x,y,1,N,1));
		}
	}
	return 0;
}
2024/9/25 20:24
加载中...