#include<bits/stdc++.h>
using namespace std;
int n,m;
struct SegementTree{
int l,r;
long long sum;
int p;
}t[400007];
long long a[100007];
void pushup(int id){
t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
return;
}
void pushdown(int id){
if(t[id].p){
t[id<<1].p+=t[id].p;
t[id<<1].sum+=t[id].p*(t[id<<1].r-t[id<<1].l+1);
t[id<<1|1].p+=t[id].p;
t[id<<1|1].sum+=t[id].p*(t[id<<1|1].r-t[id<<1|1].l+1);
t[id].p=0;
}
return;
}
void build(int id,int l,int r){
t[id].l=l;t[id].r=r;
if(l==r){t[id].sum=a[l];return;}
int mid=(l+r)>>1;
build(id<<1,l,mid);build(id<<1|1,mid+1,r);
pushup(id);
return;
}
void add(int id,int l,int r,int k){
if(l<=t[id].l&&t[id].r<=r){
t[id].sum+=k*(t[id].r-t[id].l+1);
t[id].p+=k;
return;
}
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
if(l<=mid)add(id<<1,l,r,k);
if(r>mid)add(id<<1|1,l,r,k);
pushup(id);
return;
}
long long get_sum(int id,int l,int r){
if(l<=t[id].l&&t[id].r<=r)
return t[id].sum;
pushdown(id);
int mid=(t[id].l+t[id].r)>>1;
if(r<=mid)return get_sum(id<<1,l,r);
else if (l>mid)return get_sum(id<<1|1,l,r);
else return get_sum(id<<1,l,r)+get_sum(id<<1|1,l,r);
}
int Read();
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
n=Read();m=Read();
for(int i=1;i<=n;++i)
a[i]=Read();
build(1,1,n);
for(int i=1;i<=m;++i){
int f;cin>>f;
if(f==1){
int x=Read(),y=Read(),k=Read();
add(1,x,y,k);
}
else {
int x=Read(),y=Read();
cout<<get_sum(1,x,y)<<"\n";
}
}
return 0;
}
int Read(){
char ch=getchar();
int res=0,flag=1;
while(ch<'0'||ch>'9'){
ch=='-'?flag=-1:ch=getchar();
}
while(ch>='0'&&ch<='9'){
res=(res<<3)+(res<<1)+ch-'0';
ch=getchar();
}
return flag*res;
}
如题,如果去掉 ios 那几行,就行了,如果不删,运行都会出问题。求助