#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001];
struct tree{
int l,r;long long sum,lazy;
}t[500001];
int c,x,y,k;
void build(int l,int r,int i){
t[i].l=l;
t[i].r=r;
if(l!=r){
int mid=(l+r)>>1;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
t[i].sum=t[2*i].sum+t[2*i+1].sum;
}else{
t[i].sum=a[l];
}
return;
}
void putdown(int i){
t[2*i].sum+=(t[2*i].r-t[2*i].l+1)*t[i].lazy;
t[2*i].lazy+=t[i].lazy;
t[2*i+1].sum+=(t[2*i+1].r-t[2*i+1].l+1)*t[i].lazy;
t[2*i+1].lazy+=t[i].lazy;
t[i].lazy=0;
return;
}
void add(int l,int r,int k,int i){
// cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;
if(l<=t[i].l && r>=t[i].r){
t[i].lazy+=k;
t[i].sum+=(t[i].r-t[i].l+1)*k;
return;
}
putdown(i);
int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) add(l,r,k,2*i);
if(r>mid) add(l,r,k,2*i+1);
t[i].sum=t[2*i].sum+t[2*i+1].sum;
// cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;
return;
}
long long find(int l,int r,int i){
//cout << t[i].l << " " << t[i].r << " " << t[i].sum << endl;
if(l<=t[i].l && r>=t[i].r) return t[i].sum;
else if (t[i].r<l || t[i].l>r)return 0;
putdown(i);
int mid=(t[i].l+t[i].r)>>1;
long long ans=0;
if(l<=mid) ans+=find(l,r,i*2);
if(r>mid) ans+=find(l,r,i*2+1);
return ans;
}
signed main(){
cin >> n >> m ;
for(int i=1;i<=n;i++){
cin >> a[i];
}
build(1,n,1);
while(m--){
cin >> c;
if(c==1){
cin >> x >> y >> k;
add(x,y,k,1);
}else{
cin >> x >> y;
cout << find(x,y,1) << endl;
}
}
return 0;
}
为什么把所有的int都换成long long就会报错