编辑代码

#include<bits/stdc++.h>
#define mid (l+r>>1)
#define ls (p<<1)
#define rs (p<<1|1)
using namespace std;
void build(int p,int l,int r);
void push_up(int p);
void push_down(int p,int l,int r);
void mul(int p,int l,int r,int w);
void add(int p,int l,int r);
int ask(int p,int l,int r);

const int N=1e5+2;
int n,m,op,x,y,k,a[N],s[N<<2],t[N<<2];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        cin>>op>>x>>y;
        if(op==1)
        {
            cin>>k;
            add(1,1,n);
        }
        else
            cout<<ask(1,1,n)<<"\n";
    }
    return 0;
}
void build(int p,int l,int r)
{
    if(l==r)
    {
        s[p]=a[p];
        return;
    }
    build(ls,l,mid);
    build(rs,mid+1,r);
    push_up(p);
}
void push_up(int p)
{s[p]=s[ls]+s[rs];}
void push_down(int p,int l,int r)
{
    if(!t[p])
        return;
    mul(ls,l,mid,t[p]);
    mul(rs,mid+1,r,t[p]);
    t[p]=0;
}
void mul(int p,int l,int r,int w)
{s[p]+=(r-l+1)*w,t[p]=w;}
void add(int p,int l,int r)
{
    if(l>y||r<x)
        return;
    if(l>=x&&r<=y)
    {
        mul(p,l,r,k);
        return;
    }
    push_down(p,l,r);
    add(ls,l,mid);
    add(rs,mid+1,r);
    push_up(p);
}
int ask(int p,int l,int r)
{
    if(l>y||r<x)
        return 0;
    if(l>=x&&r<=y)
        return s[p];
    push_down(p,l,r);
    return ask(ls,l,mid)+ask(rs,mid+1,r);
}