cerr是调试用的,不影响正常输出
机房里好多佬也没看出来哪里有问题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define cl(a) memset(a,0,sizeof a)
#define szread(a,n); for(ll i=1;i<=n;i++){cin>>a[i];}
#define forn(i,n) for(ll i=1;i<=n;i++)
#define copy(a,b) copy(begin(a),end(a),begin(b))
#define fin(a) freopen(a,"r",stdin)
#define fout(a) freopen(a,"w",stdout)
#define ferr(a) freopen(a,"w",stderr)
ll n,m,a[1000500],segment_tree[4000500],
op,x,y,k,lazy_tag[4000500];
void build_segment_tree(ll l,ll r,ll k){
if(l==r){
segment_tree[k]=a[l];
return;
}
ll mid=(l+r)>>1;
build_segment_tree(l,mid,k<<1);
build_segment_tree(mid+1,r,k<<1|1);
segment_tree[k]=segment_tree[k<<1]+segment_tree[k<<1|1];
}
void push_down(ll l,ll r,ll mid,ll k){
segment_tree[k<<1]+=(mid-l+1)*lazy_tag[k];
segment_tree[k<<1|1]+=(r-mid)*lazy_tag[k];
lazy_tag[k<<1]+=lazy_tag[k];
lazy_tag[k<<1|1]+=lazy_tag[k];
lazy_tag[k]=0;
}
//l,r为k包含区间,s,e修改
void addition_segment_tree(ll l,ll r,ll k,ll s,ll e,ll x){
cerr<<1<<"#\n";
if(s<=l&&r<=e){
segment_tree[k]+=(e-s+1)*x;
lazy_tag[k]+=x;
return;
}
ll mid=(l+r)>>1;
if(lazy_tag[k]&&l!=r){
push_down(l,r,mid,k);
}
if(l<=mid){
addition_segment_tree(l,mid,k<<1,s,e,x);
}
if(r>mid){
addition_segment_tree(mid+1,r,k<<1|1,s,e,x);
}
}
//l,r为k包含区间,s,e查询
ll sum_segment_tree(ll l,ll r,ll k,ll s,ll e){
cerr<<2<<"#\n";
if(s<=l&&e>=r){
return segment_tree[k];
}
ll mid=(l+r)>>1,sum;
if(lazy_tag[k]){
push_down(l,r,mid,k);
}
cerr<<"**^\n";
sum=sum_segment_tree(l,mid,k<<1,s,e);
sum+=sum_segment_tree(mid+1,r,k<<1|1,s,e);
cerr<<3<<"#\n";
return sum;
}
int main(){
cin>>n>>m;
cerr<<m<<endl;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
build_segment_tree(1,n,1);
cerr<<"*"<<m<<endl;
for(long long i=1;i<=m;i++){
cin>>op>>x>>y;
cerr<<"##"<<op<<"#"<<i<<endl;
if(op==1){
cin>>k;
cerr<<"4#\n";
addition_segment_tree(1,n,1,x,y,k);
}else{
cerr<<"5#\n";
cout<<sum_segment_tree(1,n,1,x,y)<<endl;
}
}
return 0;
}