题目呀

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#define LL long long 
using namespace std;
const int MAXN=200001;
LL a[MAXN];
struct tree{
    LL adi;
    LL sum;
    LL l;
    LL r;
    LL len;
}s[MAXN<<2];
void build(int o,int l,int r)
{ 
    s[o].r=r;s[o].l=l;s[o].len=r-l+1;
    if(l==r) s[o].sum=a[l];
    else 
    {
        int m=l+((r-l)>>1);
        build((o<<1),l,m);
        build((o<<1)+1,m+1,r);
        s[o].sum=s[(o<<1)].sum+s[(o<<1)+1].sum;
    }
}
void update(int o,int l,int r,int ind,int ans)
{
    if(l==r) {s[o].sum=ans;return;}
    int m=l+((r-l)>>1);
    if(ind<=m)
    {
        update((o<<1),l,m,ind,ans);
    }
    else
    {
        update((o<<1)+1,m+1,r,ind,ans);
    }
    s[o].sum=s[(o<<1)].sum+s[(o<<1)+1].sum;
}

void pushdown(int o)
{
    int adii=s[o].adi;
    s[(o<<1)].adi+=s[o].adi;
    s[(o<<1)+1].adi+=s[o].adi;
    s[(o<<1)].sum+=adii*s[(o<<1)].len;
    s[(o<<1)+1].sum+=adii*s[(o<<1)+1].len;
    s[o].adi=0;
}
void add(int o,int a,int b,int ad)
{
    int l=s[o].l,r=s[o].r,m=(s[o].l+s[o].r)>>1,len=s[o].len;
    if(l==a&&r==b)    
    {
        s[o].adi+=ad;
        s[o].sum+=len*ad;
        return ;
    }
    if(s[o].adi)    pushdown(o);
    if(b<=m)/*向左分*/   add((o<<1),a,b,ad);//写在下面是不对的
    else if(a>m)/*向右分*/    add((o<<1)+1,a,b,ad);
    else add((o<<1),a,m,ad),add((o<<1)+1,m+1,b,ad);//区间交叉分
    s[o].sum=s[(o<<1)].sum+s[(o<<1)+1].sum;
}
LL ask(int o,int a,int b)
{
    int l=s[o].l,r=s[o].r,m=(s[o].l+s[o].r)>>1;
    if(a==l&&b==r){return s[o].sum;}
    if(s[o].adi)    pushdown(o);//此处需要标记下放
    if(b<=m)    return ask(o<<1,a,b);
    else if(a>m)    return ask(o<<1|1,a,b);
    else return ask(o<<1,a,m)+ask(o<<1|1,m+1,b);//同上
}
int main()
{
    int n,m,i,j;

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;i++)
     scanf("%lld",&a[i]);

    build(1,1,n);

    for(i=1;i<=m;i++)
     {
        LL x,a1,b,k;
        scanf("%lld",&x);
        if(x==1) 
        {
            scanf("%lld%lld%lld",&a1,&b,&k);
            add(1,a1,b,k);
        } 
        else
        {
            scanf("%lld%lld",&a1,&b);
            printf("%lld\n",ask(1,a1,b));
        }
     }

     return 0;
}

DO YOU LIKE MI FOR 爱