#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 114514 * 4;
int n,m;
int a[N],tree[N],lay[N];
void build(int l,int r,int p){
if(l == r){
tree[p] = a[r];
return ;
}
int mid = l + r >> 1;
build(l,mid,p * 2);
build(mid + 1,r,p * 2 + 1);
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
int query(int l,int r,int s,int t,int p){
if(l <= s && t <= r){
return tree[p];
}
int mid = s + t >> 1;
int sum = 0;
if(lay[p] && s != t){
tree[p * 2] += lay[p] * (m - s + 1);
tree[p * 2 + 1] += lay[p] * (t - m);
lay[p * 2] += lay[p];
lay[p * 2 + 1] += lay[p];
lay[p] = 0;
}
if(l <= mid) sum += query(l,r,s,mid,p * 2);
if(mid < r) sum += query(l,r,mid + 1,t,p * 2 + 1);
return sum;
}
void update(int l,int r,int c,int s,int t,int p){
if(l <= s && t <= r){
tree[p] += (t - s + 1) * c;
lay[p] += c;
return ;
}
int m = s + t >> 1;
if(lay[p] && s != t){
tree[p * 2] += lay[p] * (m - s + 1);
tree[p * 2 + 1] += lay[p] * (t - m);
lay[p * 2] += lay[p];
lay[p * 2 + 1] += lay[p];
lay[p] = 0;
}
if(l <= m){
update(l,r,c,s,m,p * 2);
}
if(m < r){
update(l,r,c,m + 1,t,p * 2 + 1);
}
tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
signed main(){
cin >> n >> m;
for(int i = 1;i <= n;i ++ ){
cin >> a[i];
}
build(1,n,1);
while(m -- ){
int op;
cin >> op;
if(op == 1){
int x,y,k;
cin >> x >> y >> k;
update(x,y,k,1,n,1);
}
else{
int x,y;
cin >> x >> y;
cout << query(x,y,1,n,1) << endl;
}
}
}
甚至验证码里都是WA