1.线段树模板
模板
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll a[maxn];
ll d[maxn];
ll tag[maxn];
void build(ll s,ll t,ll p){
if(s==t){
d[p]=a[s];
return;
}
ll mid=(s+t)>>1;
build(s,mid,p<<1);
build(mid+1,t,(p<<1)|1);
d[p]=d[p<<1]+d[(p<<1)|1];
}
void update(ll l,ll r,ll c,ll s,ll t,ll p){
if(l<=s&&t<=r){
d[p]+=c*(t-s+1);
tag[p]+=c;
return;
}
ll mid=(s+t)>>1;
if(tag[p]&&s!=t){
d[p<<1]+=(mid-s+1)*tag[p];
d[(p<<1)|1]+=(t-mid)*tag[p];
tag[p<<1]+=tag[p];
tag[(p<<1)|1]+=tag[p];
tag[p]=0;
}
if(l<=mid)update(l,r,c,s,mid,p<<1);
if(r>mid)update(l,r,c,mid+1,t,(p<<1)|1);
d[p]=d[p<<1]+d[(p<<1)|1];
}
ll get(ll l,ll r,ll s,ll t,ll p){
if(l<=s&&t<=r)
return d[p];
ll mid=(s+t)>>1,sum=0;
if(tag[p]&&s!=t){
d[p<<1]+=(mid-s+1)*tag[p];
d[(p<<1)|1]+=(t-mid)*tag[p];
tag[p<<1]+=tag[p];
tag[(p<<1)|1]+=tag[p];
tag[p]=0;
}
if(l<=mid)sum+=get(l,r,s,mid,p<<1);
if(r>mid)sum+=get(l,r,mid+1,t,(p<<1)|1);
return sum;
}
void solve(){
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
build(1,n,1);
while(m--){
int a;
cin>>a;
if(a==1){
int x,y,k;
cin>>x>>y>>k;
update(x,y,k,1,n,1);
}
else{
int x,y;
cin>>x>>y;
cout<<get(x,y,1,n,1)<<'\n';
}
}
}