参考:https://blog.csdn.net/zearot/article/details/48299459

模板:https://www.luogu.com.cn/problem/P3372

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;
long long a[maxn];
long long sum[maxn*4],add[maxn*4];
void jianshu(int l,int r,int w)
{
    if(l==r)
    {
        sum[w]=a[l];
        return ;
    }
    int mid=(l+r)/2;
    jianshu(l,mid,w*2);
    jianshu(mid+1,r,w*2+1);
    sum[w]=sum[w*2]+sum[w*2+1];
    return ;
}
int x,y;
long long k;
void pushdown(int w,int size1,int size2)
{
    add[w*2]+=add[w];
    add[w*2+1]+=add[w];
    sum[w*2]+=add[w]*size1;
    sum[w*2+1]+=add[w]*size2;
    add[w]=0;
    return ;
}
void jia(int l,int r,int w)
{
    if(l>=x&&r<=y)
    {
        sum[w]+=(r-l+1)*k;
        add[w]+=k;
        return ;
    }
    int mid=(l+r)/2;
    pushdown(w,mid-l+1,r-mid);
    if(x<=mid)
    {
        jia(l,mid,w*2);
    }
    if(mid<y)
    {
        jia(mid+1,r,w*2+1);
    }
    sum[w]=sum[w*2]+sum[w*2+1];
    return ;
}
long long ans=0;
void cha(int l,int r,int w)
{
    if(l>=x&&r<=y)
    {
        ans+=sum[w];
        return ;
    }
    int mid=(l+r)/2;
    pushdown(w,mid-l+1,r-mid);
    if(x<=mid)
    {
        cha(l,mid,w*2);
    }
    if(mid<y)
    {
        cha(mid+1,r,w*2+1);
    }
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    jianshu(1,n,1);
    while(m--)
    {
        int op;
        scanf("%d%d%d",&op,&x,&y);
        if(op==1)
        {
            scanf("%lld",&k);
            jia(1,n,1);
        }
        else
        {
            ans=0;
            cha(1,n,1);
            printf("%lld\n",ans);
        }
    }
    return 0;
}