求助70

P3372 【模板】线段树 1

newmap @ 2024-04-04 18:33:32

#include<bits/stdc++.h>
using namespace std;
using ll=unsigned long long;

ll a[100001];

struct segmentTree
{
    vector<int> node,tag;
    ll ls(ll p){return p<<1;}
    ll rs(ll p){return (p<<1)+1;}

    segmentTree(ll n)
    {
        node.resize(n<<2+1);
        tag.resize(n<<2+1);
    }

    void build(ll l,ll r,ll p)
    {
        if(l==r)
        {
            cin>>node[p];
            return;
        }
        ll mid=(l+r)>>1;
        build(l,mid,ls(p));
        build(mid+1,r,rs(p));
        node[p]=node[ls(p)]+node[rs(p)];
    }

    void pass(ll l,ll r,ll p,ll k)
    {
        tag[p]+=k;
        node[p]+=k*(r-l+1);
    }

    void pass_tag(ll l,ll r,ll p)
    {
        if(tag[p])
        {
            ll mid=(l+r)>>1;
            pass(l,mid,ls(p),tag[p]);
            pass(mid+1,r,rs(p),tag[p]);
            tag[p]=0;
        }
    }

    void update(ll upl,ll upr,ll k,ll l,ll r,ll p)
    {
        if(upl<=l && r<=upr)
        {
            node[p]+=k*(r-l+1);
            tag[p]+=k;
            return;
        }
        pass_tag(l,r,p);
        ll mid=(l+r)>>1;
        if(upl<=mid)update(upl,upr,k,l,mid,ls(p));
        if(mid<upr)update(upl,upr,k,mid+1,r,rs(p));
        node[p]=node[ls(p)]+node[rs(p)];
    }

    ll query(ll ql,ll qr,ll l,ll r,ll p)
    {
        if(ql<=l && r<=qr)return node[p];
        ll res=0,mid=(r+l)>>1;
        pass_tag(l,r,p);
        if(ql<=mid)res+=query(ql,qr,l,mid,ls(p));
        if(mid<qr)res+=query(ql,qr,mid+1,r,rs(p));
        return res;
    }
};

int main()
{
    std::ios::sync_with_stdio(false);
    ll n,m;
    cin>>n>>m;
    segmentTree j(n);
    j.build(1,n,1);
    for(int i=0;i<m;i++)
    {
        ll op,l,r,k;
        cin>>op;
        if(op==1)
        {
            cin>>l>>r>>k;
            j.update(l,r,k,1,n,1);
        }else if(op==2)
        {
            cin>>l>>r;
            cout<<j.query(l,r,1,n,1)<<endl;
        }
    }
    system("pause");
}

by Simple_Stardust @ 2024-04-14 21:16:06

@newmap vector<int> node,tag; 这里应该修改为 vector<long long> node,tag; 这里的值会超过int的大小的


|