玄关!0分求调

P3372 【模板】线段树 1

_Gloaming_ @ 2024-11-28 14:42:02

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int rr()
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9')
    {if(c=='-')f=-1;c=getchar();}
    while(c<='9'&&c>='0')
    {x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int N=1e5+10;
struct node
{
    int l,r;
    ll w,f;
}t[N<<2];
int n,q;
ll a[N];
void up(int k)
{
    t[k].w=t[k<<1].w+t[k<<1|1].w;
    return;
}
void down(int k)
{
    if(t[k].f)
    {
        t[k<<1].w+=(t[k<<1].r-t[k<<1].l+1)*t[k].f;
        t[k<<1|1].w+=(t[k<<1|1].r-t[k<<1|1].l+1)*t[k].f;
        t[k<<1].f+=t[k].f;
        t[k<<1|1].f+=t[k].f;
        t[k].f=0;
    }
    return;
}
void build(int k,int l,int r)
{
    t[k].l=l;t[k].r=r;
    if(l==r)
    {
        t[k].w=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    up(k);
}
void add(int k,int l,int r,ll v)
{
    if(l<=t[k].l && t[k].r<=r)
    {
        t[k].f+=v;
        t[k].w=(t[k].r-t[k].l+1)*v;//!!!
        return;
    }
    down(k);
    int mid=(t[k].l+t[k].r)>>1;
    if(l<=mid)
        add(k<<1,l,r,v);
    if(r>mid)
        add(k<<1|1,l,r,v);
    up(k);
}
ll query(int k,int l,int r)
{
    if(l<=t[k].l&&t[k].r<=r)
        return t[k].w;
    down(k);
    ll ans=0;
    int mid=(t[k].l+t[k].r)>>1;
    if(l<=mid)
        ans+=query(k<<1,l,r);
    if(r>mid)
        ans+=query(k<<1|1,l,r);
    up(k);
    return ans;
}
int main()
{
    n=rr();q=rr();
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    build(1,1,n);
    while(q--)
    {
        int l,r,v,op;
        cin>>op;l=rr();r=rr();
        if(op==1)
        {
            scanf("%lld",&v);
            add(1,l,r,v);
        }
        else
            cout<<query(1,l,r)<<"\n";
    }
    return 0;
}

by aaa1145141919810 @ 2024-11-29 10:22:15

query里不用up


by aaa1145141919810 @ 2024-11-29 10:31:43

t[k].w=(t[k].r-t[k].l+1)*v;//!!!

这一行把等号改成+=


|