70分WA
#include<bits/stdc++.h>
using namespace std;
long long a[100005],d[400005],b[400005],n,m,ques,x,y,k;
void build(long long s,long long t,long long p)
{
if(s==t)
{
d[p]=a[s];
return;
}
long long m=s+((t-s)>>1);
build(s,m,p<<1);
build(m+1,t,(p<<1)+1);
d[p]=d[p<<1]+d[(p<<1)+1];
return;
}
void update(long long l,long long r,long long c,long long s,long long t,long long p)
{
if(l<=s&&r>=t)
{
b[p]+=c;
d[p]+=c*(t-s+1);
return;
}
long long m=s+((t-s)>>1);
if(b[p]&&s!=t)
{
b[p<<1]+=b[p];
b[(p<<1)+1]+=b[p];
d[p<<1]+=b[p]*(m-s+1);
d[(p<<1)+1]+=b[p]*(t-m);
b[p]=0;
}
if(l<=m)
{
update(l,r,c,s,m,(p<<1));
}
if(r>m)
{
update(l,r,c,m+1,t,(p<<1)+1);
}
d[p]=d[p<<1]+d[(p<<1)+1];
}
int getsum(long long l,long long r,long long s,long long t,long long p)
{
if(l<=s&&r>=t)
{
return d[p];
}
long long m=s+((t-s)>>1);
if(b[p])
{
d[p<<1]+=b[p]*(m-s+1);
d[(p<<1)+1]+=b[p]*(t-m);
b[p<<1]+=b[p];
b[(p<<1)+1]+=b[p];
b[p]=0;
}
long long sum=0;
if(l<=m)
sum+=getsum(l,r,s,m,p*2);
if(r>m)
sum+=getsum(l,r,m+1,t,p*2+1);
return sum;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,n,1);
for(long long i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&ques,&x,&y);
if(ques==1)
{
scanf("%lld",&k);
update(x,y,k,1,n,1);
}
if(ques==2)
{
printf("%lld\n",getsum(x,y,1,n,1));
}
}
return 0;
}