#include<bits/stdc++.h>
using namespace std;
struct node{
int l,r;
int num,tag;
}tree[400005];
int n,m;
int a[100005];
void build(int l,int r,int p){
tree[p].l = l;
tree[p].r = r;
if(l == r){
tree[p].num = a[l];
return;
}
int mid = (l + r) / 2;
build(l,mid,2 * p);
build(mid + 1,r,2 * p + 1);
tree[p].num = tree[2 * p].num + tree[2 * p + 1].num;
}
void add(int l,int r,int p,int x){
if(l <= tree[p].l && tree[p].r <= r){
tree[p].tag += x;
tree[p].num += (r - l + 1) * x;
}else{
int mid = (l + r) / 2;
add(l,mid,2 * p,x);
add(mid + 1,r,2 * p + 1,x);
}
}
void update(int p){
tree[2 * p].num += (tree[2 * p].r - tree[2 * p].l + 1) * tree[p].tag;
tree[2 * p].tag += tree[p].tag;
tree[2 * p + 1].num += (tree[2 * p + 1].r - tree[2 * p + 1].l + 1) * tree[p].tag;
tree[2 * p + 1].tag += tree[p].tag;
tree[p].tag = 0;
}
int getsum(int l,int r,int p){
update(p);
int mid = (l + r) / 2;
if(tree[p].l > r || tree[p].r < l) return 0;
if(l == r){
return tree[p].num;
}
if(tree[p].l < l && tree[p].r > r){
return tree[p].num;
}
return getsum(l,mid,2 * p) + getsum(mid + 1,r,2 * p + 1);
}
int main(){
cin>>n>>m;
for(int i = 1;i <= n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i = 1;i <= m;i++){
int t;
cin>>t;
if(t == 1){
int x,y,k;
cin>>x>>y>>k;
add(x,y,1,k);
}
if(t == 2){
int x,y;
cout<<getsum(x,y,1)<<endl;
}
}
}
RT,代码见上,感谢各位大佬的Debug