rt
#include <iostream>
using namespace std;
#define ll long long
const int maxn = 100010 ;
ll a[maxn * 4] , w[maxn * 4] , lzy[maxn * 4];
void pushup(const int x){
w[x] = w[2 * x] + w[2 * x + 1] ;
}
//建树
void build(const int u , int l , int r){//u意思为树上的某个节点
if(l == r){
w[u] = a[l] ;
return ;
}
int M = (l + r) / 2 ;
build((2 * u) , l , M) ;
build((2 * u) + 1 , M + 1, r) ;
pushup(u) ;
}
//ll quarry1(int u , int l , int r , int p){//单点
// if(l == r)
// return w[u] ;
// else{
// int M = (l + r) >> 2 ;
// if(M >= p)
// return quarry1(u * 2 , l , M , p) ;
// else
// return quarry1(u * 2 + 1 , M + 1 , r , p) ;
// }
//}
//void updata1(int u , int l , int r , int p , ll x){//单点
// if(l == r)
// w[u] = x ;
// else{
// int M = (l + r) >> 2 ;
// if(M >= p)
// updata1(u * 2 , l , M , p , x) ;
// else
// updata1(u * 2 + 1 , M + 1 , r , p , x) ;
// pushup(x);
// }
//}
bool inrange(int L , int R , int l , int r){
return (l <= R) && (L <= l) ;
}
bool outrange(int L , int R , int l , int r){
return (L > r) || (R < l) ;
}
void maketage(int u , int len , ll x){
lzy[u] += x ;
w[u] += len * x ;
}
void pushdown(int u , int l , int r){
int M = (l + r) / 2 ;
maketage(2 * u , M - l + 1 , lzy[u]) ;
maketage(2 * u + 1, r - M , lzy[u]) ;
lzy[u] = 0 ;
}
ll quarry(int u , int L , int R , int l , int r){//L R 是所求求区间
if(inrange(L , R , l , r))
return w[u] ;
else if(!outrange(L , R , l , r)){
int M = (L + R) / 2 ;
pushdown(u , L , R) ;
return quarry(2 * u , L , M , l , r) + quarry(2 * u + 1 , M + 1 , R , l , r);
}else return 0 ;
}
void updata(int u , int L , int R , int l , int r , ll x){
if(inrange(L , R , l , r))
maketage(u , R - L + 1 , x) ;
else if(!outrange(L , R , l , r)){
int M = (L + R) / 2 ;
pushdown(u , L , R) ;
updata(u * 2 , L , M , l , r , x) ;
updata(u * 2 + 1 , M + 1, R , l , r , x) ;
pushup(u) ;
}
}
int main(){
int n , m ;
cin>>n>>m ;
for(int i = 1; i <= n ; i++)
cin>>a[i] ;
build(1 , 1 , n) ;
for(int t = 1 ; t <= m ; t++){
int op , x , y ;
ll k ;
cin>>op ;
if(op == 1){
cin>>x>>y>>k;
updata(1 , 1 , n , x , y , k);
}else if(op == 2){
cin>>x>>y;
cout<<quarry(1 , 1 , n , x , y) <<endl;
}
}
return 0 ;
}