/*
Segment tree
标记永久化
by sbn
2018-3-30
*/
using namespace std ;
typedef long long ll;
typedef vector < int > vi;
typedef pair< int , int > pii;
struct node{
int l,r;
ll add,sum;
node(){}
node( int nl, int nr, int nsum){
l=nl;r=nr;sum=nsum;add= 0 ;
}
}T[ 4000001 ];
int n,m;
ll arr[ 4000001 ];
void build(int rt,int l,int r) {
T[rt]=node(l,r, 0 );
if (l==r -1 ){
T[rt].sum=arr[l];
return ;
}
build(lch(rt),l,(l+r)>> 1 );
build(rch(rt),(l+r)>> 1 ,r);
T[rt].sum=T[lch(rt)].sum+T[rch(rt)].sum;
}
void add(int rt,int l,int r,ll num) {
int nl=T[rt].l,nr=T[rt].r;
if (nl>=r||l>=nr) return ;
if (l<=nl&&nr<=r){
T[rt].add+=num;
T[rt].sum+=num*(nr-nl);
return ;
}
add(lch(rt),l,r,num);
add(rch(rt),l,r,num);
T[rt].sum=T[lch(rt)].sum+T[rch(rt)].sum+T[rt].add*(nr-nl);
}
ll getsum(int rt,int l,int r,ll num) {
int nl=T[rt].l,nr=T[rt].r;
if (l<=nl&&nr<=r) return T[rt].sum+num*(nr-nl);
if (l>nr||nl>r) return 0 ;
return getsum(lch(rt),l,r,num+T[rt].add)+getsum(rch(rt),l,r,num+T[rt].add);
}
int main() {
scanf ( "%d%d" ,&n,&m);
For(i, 0 ,n) scanf ( "%lld" ,arr+i);
build( 1 , 0 ,n);
For(i, 0 ,m){
int a,b,c;
scanf ( "%d%d%d" ,&a,&b,&c);
if (a== 1 ){
ll d;
scanf ( "%lld" ,&d);
add( 1 ,b -1 ,c,d);
} else
printf ( "%lld\n" ,getsum( 1 ,b -1 ,c, 0 ));
}
//debug();
return 0 ;
}
Segment tree
标记永久化
by sbn
2018-3-30
*/
using namespace std ;
typedef long long ll;
typedef vector < int > vi;
typedef pair< int , int > pii;
struct node{
int l,r;
ll add,sum;
node(){}
node( int nl, int nr, int nsum){
l=nl;r=nr;sum=nsum;add= 0 ;
}
}T[ 4000001 ];
int n,m;
ll arr[ 4000001 ];
void build(int rt,int l,int r) {
T[rt]=node(l,r, 0 );
if (l==r -1 ){
T[rt].sum=arr[l];
return ;
}
build(lch(rt),l,(l+r)>> 1 );
build(rch(rt),(l+r)>> 1 ,r);
T[rt].sum=T[lch(rt)].sum+T[rch(rt)].sum;
}
void add(int rt,int l,int r,ll num) {
int nl=T[rt].l,nr=T[rt].r;
if (nl>=r||l>=nr) return ;
if (l<=nl&&nr<=r){
T[rt].add+=num;
T[rt].sum+=num*(nr-nl);
return ;
}
add(lch(rt),l,r,num);
add(rch(rt),l,r,num);
T[rt].sum=T[lch(rt)].sum+T[rch(rt)].sum+T[rt].add*(nr-nl);
}
ll getsum(int rt,int l,int r,ll num) {
int nl=T[rt].l,nr=T[rt].r;
if (l<=nl&&nr<=r) return T[rt].sum+num*(nr-nl);
if (l>nr||nl>r) return 0 ;
return getsum(lch(rt),l,r,num+T[rt].add)+getsum(rch(rt),l,r,num+T[rt].add);
}
int main() {
scanf ( "%d%d" ,&n,&m);
For(i, 0 ,n) scanf ( "%lld" ,arr+i);
build( 1 , 0 ,n);
For(i, 0 ,m){
int a,b,c;
scanf ( "%d%d%d" ,&a,&b,&c);
if (a== 1 ){
ll d;
scanf ( "%lld" ,&d);
add( 1 ,b -1 ,c,d);
} else
printf ( "%lld\n" ,getsum( 1 ,b -1 ,c, 0 ));
}
//debug();
return 0 ;
}