1 条题解

  • 0
    @ 2026-1-11 22:06:15

    其实不用几乎改,但我这是懒得写了,这道题事实上不需要懒标记下传。因为是单点修改,是修改的”树叶“。 只是说用最基础的板子没有逻辑上的错误。

    #include<iostream>
    using namespace std;
    #define lc p<<1
    #define rc p<<1|1
    #define N 200005
    long long arr[N];
    
    struct node
    {
        long long l,r,sum,add;
    }tr[N*4];
    
    void PushUp(int p)
    {
        tr[p].sum=tr[lc].sum+tr[rc].sum;
    }
    
    void PushDown(long long p)
    {
        if(tr[p].add)
        {
            tr[lc].sum+=tr[p].add*(tr[lc].r-tr[lc].l+1);
            tr[rc].sum+=tr[p].add*(tr[rc].r-tr[rc].l+1);
            tr[lc].add+=tr[p].add;
            tr[rc].add+=tr[p].add;
            tr[p].add=0;
        }
    }
    
    void Update(long long p,int x,int y,long long k) //区间添加。
    {
        if(x<=tr[p].l&&tr[p].r<=y)
        {
            tr[p].sum+=k*(tr[p].r-tr[p].l+1);
            tr[p].add+=k;
            return ;
        }
        long long m=(tr[p].l+tr[p].r)>>1;
        PushDown(p);
        if(x<=m) Update(lc,x,y,k);
        if(y>m) Update(rc,x,y,k);
        PushUp(p);
    }
    
    long long Query(long long p,long long l,int r)  //查询
    {
        if(l<=tr[p].l&&tr[p].r<=r)
        {
            return tr[p].sum;
        }
        long long m=(tr[p].l+tr[p].r)>>1;
        PushDown(p);
        long long sum=0;
        if(l<=m) sum+=Query(lc,l,r);
        if(r>m) sum+=Query(rc,l,r);
        return sum;
    }
    
    void Build(long long p,long long l,long long r)
    {
        tr[p]={l,r,arr[l],0};
        if(l==r) return ;
        long long m=(l+r)>>1;
        Build(lc,l,m);
        Build(rc,m+1,r);
        PushUp(p);
    }
    
    long long n,m,op,x,y,k;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>arr[i];
        Build(1,1,n);
        while(m--)
        {
            cin>>op>>x>>y;
            switch (op)
            {
                case 1:
                    Update(1,x,x,y);
                    break;
            
                case 2:
                    long long res=Query(1,x,y);
                    cout<<res<<"\n";
                    break;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    107
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    162
    已通过
    28
    上传者