/*
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;
}