#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m;
long long arr[100001],num,x,y,k;
long long tree[400004],maxx,ans,lazytag[400004];
void build_tree(long long node,long long l,long long r)
{
if(l==r)
{
maxx=max(node,maxx);
tree[node]=arr[l];
return;
}
long long mid=(l+r)/2;
build_tree(node*2+1,l,mid);
build_tree(node*2+2,mid+1,r);
tree[node]=tree[node*2+1]+tree[node*2+2];
}
int summ(long long node,long long l,long long r,long long L,long long R)
{
if(lazytag[node]!=0)
{
tree[node]+=(r-l+1)*lazytag[node];
if(l!=r)
{
lazytag[node*2+1]+=lazytag[node];
lazytag[node*2+2]+=lazytag[node];
}
else
arr[l]=tree[node];
lazytag[node]=0;
}
if(l>R||r<L||L>R)
return 0;
if(l==r)
return arr[l];
if(l==L&&r==R)
return tree[node];
long long mid=(l+r)/2;
return summ(node*2+1,l,mid,L,min(mid,R))+summ(node*2+2,mid+1,r,max(L,mid+1),R);
}
void add(long long node,long long l,long long r,long long L,long long R)
{
if(l>R||r<L||L>R)
return;
if(l==r)
{
arr[l]+=k;
tree[node]+=k;
return;
}
if(l==L&&r==R)
{
lazytag[node]+=k;
return;
}
long long mid=(l+r)/2;
tree[node]+=((min(r,R)-max(L,l)+1)*k);
add(node*2+1,l,mid,L,min(mid,R));
add(node*2+2,mid+1,r,max(L,mid+1),R);
}
int main()
{
scanf("%lld%lld",&n,&m);
long long i;
for(i=1;i<=n;i++)
scanf("%lld",&arr[i]);
build_tree(0,1,n);
for(i=1;i<=m;i++)
{
scanf("%lld",&num);
if(num==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(0,1,n,x,y);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",summ(0,1,n,x,y));
}
}
return 0;
}
后3个点WA,所有变量都开了long long