线段树写挂,求条(样例没过)

P3372 【模板】线段树 1

违规用户名920406 @ 2024-08-31 16:52:01

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+1;
ll n,m,p,b,c,d,a[N],T[N<<2],tag[N<<2];
inline ll ls(ll x) {return x<<1;}
inline ll rs(ll x) {return x<<1|1;}
inline void push_up(ll x) {T[x]=T[ls(x)]+T[rs(x)];}
inline void push_down(ll l,ll r,ll x)
{
    ll m=(l+r)>>1;
    a[ls(x)]+=tag[x]*(m-l+1);
    tag[ls(x)]+=tag[x];
    a[rs(x)]+=tag[x]*(r-m);
    tag[rs(x)]+=tag[x];
    tag[x]=0;
}
void bulid(ll l,ll r,ll x)
{
    if(l==r)
    {
        T[x]=a[l];
        return;
    }
    ll m=(l+r)>>1;
    bulid(l,m,ls(x));
    bulid(m+1,r,rs(x));
    push_up(x);
}
void update(ll l,ll r,ll nl,ll nr,ll x,ll c)
{
    if(nl<=l&&r<=nr)
    {
        T[x]+=c*(r-l+1);
        tag[x]+=c;
        return;
    }
    push_down(l,r,x);
    m=(l+r)>>1;
    if(nl<=m)   update(l,m,nl,nr,ls(x),c);
    if(nr>m)    update(m+1,r,nl,nr,rs(x),c);
    push_up(x);
}
ll query(ll l,ll r,ll nl,ll nr,ll x)
{
    if(nl<=l&&r<=nr)    return T[x];
    push_down(l,r,x);
    ll m=(l+r)>>1,c=0;
    if(nl<=m)   c+=query(l,m,nl,nr,ls(x)); 
    if(nr>m)    c+=query(m+1,r,nl,nr,rs(x));
    return c; 
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    bulid(1,n,1);
    while(m--)
    {
        cin>>p;
        if(p==1)
        {
            cin>>b>>c>>d;
            update(1,n,b,c,1,d);
        }
        else
        {
            cin>>b>>c;
            cout<<query(1,n,b,c,1)<<endl;
        }
    }
    return 0;
}

玄关


by Ke9_qux @ 2024-08-31 17:19:19

@buzhidao0123 玄学错误


by Ke9_qux @ 2024-08-31 17:21:14

@buzhidao0123 在第40~42行m值好像因为宇宙射线而改变了


上一页 |