爆0求助

P3372 【模板】线段树 1

Reply_ @ 2022-10-24 22:09:35

呜呜呜

#include<bits/stdc++.h>
using namespace std;
struct Node
{
    int l,r,sum,add;
}t[40100101];
int a[10000001];
inline void build(int li,int ri,int w)
{
    t[w].l=li;
    t[w].r=ri;
    if(li==ri){
        t[w].sum=a[li];
        return;
    }
    int mid=(li+ri)>>1;
    build(li,mid,2*w);
    build(mid+1,ri,2*w+1);
    t[w].sum=t[w*2].sum+t[w*2+1].sum;
    return;
}
inline void push_down(int p)
{
    if(t[p].add)
    {
        t[p*2].sum+=t[p].add*(t[p*2].r-t[p*2].l+1);
        t[p*2+1].sum+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
        t[p*2].add+t[p].add;
        t[p*2+1].add+=t[p].add;
        t[p].add=0;
    }
}
inline void change(int li,int ri,int w,int ad)
{
    if(li<=t[w].l && ri>=t[w].r)
    {
        t[w].sum+=ad*(t[w].r-t[w].l+1);
        t[w].add+=ad;
        return;
    }
    push_down(w);
    int mid=t[w].l+t[w].r>>1,s=0;
    if(li<=mid) change(li,ri,w*2,ad);
    if(ri>mid) change(li,ri,w*2+1,ad);
    return;
}
inline int find(int li,int ri,int w)
{
    if(t[w].l>=li&&t[w].r<=ri)return t[w].sum;
    push_down(w);
    int mid=t[w].l+t[w].r>>1,s=0;
    if(li<=mid) s+=find(li,mid,w*2);
    if(ri>=mid) s+=find(mid+1,ri,w*2+1);
    return s;
} 
int main()
{
    int n,m;
    cin >> n>>m;
    for(int i = 1;i<=n;i++) cin >> a[i];
    build(1,n,1);
    for(int i = 1;i<=m;i++)
    {
        int op;
        cin >> op;
        if(op==1)
        {
            int l,r,ad;
            cin >> l >> r >>ad;
            change(l,r,1,ad);
        }
        else
        {
            int l,r;
            cin >> l >> r;
            cout<<find(l,r,1);
        }
    }
    return 0;
}

by Micnation_AFO @ 2022-10-24 22:10:51

@Chenyz

if(ri>=mid) s+=find(mid+1,ri,w*2+1);

不能取等


|