求助,最后一个样例输出是19

P3372 【模板】线段树 1

zjx011222_is_sb @ 2023-05-13 23:26:01

#include<iostream>
using namespace std;
int n,m;
struct info
{
    int sum,l,r,tag;
} tre[200005];
int a[100005];
inline void pushup(int u)
{
    tre[u].sum=tre[u<<1].sum+tre[u<<1|1].sum;
}
void build(int u,int l,int r)
{
    tre[u].l=l;
    tre[u].r=r;
    if(l==r)
    {
        tre[u].sum=a[l];
        return;
    }
    int mid=(r+l)>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
inline void maketag(int u,int len,int k)
{
    tre[u].tag+=k;
    tre[u].sum+=k*len;
}
inline void pushdown(int u,int l,int r)
{
    int mid=(l+r)>>1;
    maketag(u<<1,mid-l+1,tre[u].tag);
    maketag(u<<1|1,r-mid,tre[u].tag);
    tre[u].tag=0;
}
inline void update(int u,int l,int r,int k)
{
    if(tre[u].l>=l&&tre[u].r<=r)
    {
        maketag(u,r-l+1,k);
        return;
    }
    pushdown(u,l,r);
    int mid=(tre[u].l+tre[u].r)>>1;
    if(l<=mid) update(u<<1,l,mid,k);
    if(r>mid) update(u<<1|1,mid+1,r,k);
    pushup(u);
}
int query(int u,int l,int r)
{
    int res=0;
    if((tre[u].l>=l)&&(tre[u].r<=r)) return tre[u].sum;
    pushdown(u,l,r);
    int mid=(tre[u].l+tre[u].r)>>1;
    if(l<=mid) res+=query(u<<1,l,mid);
    if(r>mid) res+=query(u<<1|1,mid+1,r);
    return res;
}
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++)
    {
        int opt,x,y,k;
        cin>>opt;
        if(opt==1)
        {
            cin>>x>>y>>k;
            update(1,x,y,k);
        }
        else
        {
            cin>>x>>y;
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

|