#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=120000;
int n,m,a[N];
struct tree{
int l,r,dat,add;
}s[N*4+2];
void build(int p,int l,int r){
s[p].l=l,s[p].r=r;
if(l==r){
s[p].dat=a[l];
return ;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
s[p].dat=s[p*2].dat+s[p*2+1].dat;
}
void spread(int p){
if(s[p].add){
s[p*2].dat+=s[p].add*(s[p*2].r-s[p*2].l+1);
s[p*2+1].dat+=s[p].add*(s[p*2+1].r-s[p*2+1].l+1);
s[p*2].add+=s[p].add,s[p*2+1].add+=s[p].add;
s[p].add=0;
}
}
void change(int p,int x,int y,int k){
if(x<=s[p].l&&y>=s[p].r){
s[p].dat+=k*(s[p].r-s[p].l+1);
s[p].add+=k;
return ;
}
spread(p);
int mid=(s[p].r-s[p].l)/2;
if(x<=mid) change(p*2,x,y,k);
if(y>mid) change(p*2+1,x,y,k);
s[p].dat+=s[p*2].dat+s[p*2+1].dat;
}
int ask(int p,int x,int y){
if(x<=s[p].l&&y>=s[p].r) return s[p].dat;
spread(p);
int mid=(s[p].r-s[p].l)/2;
int ans=0;
if(x<=mid) ans+=ask(p*2,x,y);
if(y>mid) ans+=ask(p*2+1,x,y);
return ans;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int c,x,y,k;
cin>>c>>x>>y;
if(c==1){
cin>>k;
change(1,x,y,k);
}
else{
cout<<ask(1,x,y)<<endl;
}
}
return 0;
}
疑似 ask 或 build 函数有问题,但我太蒟蒻了,找不出。