求助,10分样例过了

P3372 【模板】线段树 1

Derrick_Rose @ 2023-08-23 11:19:51

除了第二个点全 WA
代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#define int long long
#define N 100100
using namespace std;
int n,m,a[N];
struct node
{
    int le,ri;
    int val,tag;
}T[N<<2];
void build(int i,int l,int r)
{
    T[i].le=l,T[i].ri=r;
    if(l==r)
    {
        T[i].val=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(i<<1,l,mid);
    build(i<<1|1,mid+1,r);
    T[i].val=T[i<<1].val+T[i<<1|1].val;
}
void pushdown(int i)
{
    T[i<<1].val+=(T[i<<1].ri-T[i<<1].le+1)*T[i].tag;
    T[i<<1|1].val+=(T[i<<1|1].ri-T[i<<1|1].le+1)*T[i].tag;
    T[i<<1].tag+=T[i].tag;
    T[i<<1|1].tag+=T[i].tag;
    T[i].tag=0;
}
void update(int i,int l,int r,int k)
{
    if(l<=T[i].le&&r>=T[i].ri)
    {
        T[i].tag+=k;
        T[i].val+=(T[i].ri-T[i].le+1)*k;
        return;
    }
    if(T[i].tag)pushdown(i);
    int mid=(T[i].le+T[i].ri)>>1;
    if(l<=mid)update(i<<1,l,r,k);
    if(r>=mid+1)update(i<<1|1,l,r,k);
    T[i].val=T[i<<1].val+T[i<<1|1].val;
}

int ask(int i,int l,int r)
{

    if(l<=T[i].le&&r>=T[i].ri)
        {
            return T[i].val;
        }
    if(T[i].tag)pushdown(i);
    int mid=(T[i].ri+T[i].le)>>1,ans=0;
    if(l<=mid)ans+=ask(i<<1,l,mid);
    if(r>=mid+1)ans+=ask(i<<1|1,mid+1,r);
    return ans;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int q,x,y;
        cin>>q>>x>>y;
        if(q==1)
        {
            int k;
            cin>>k;
            update(1,x,y,k);
        }
        if(q==2)
        {
            cout<<ask(1,x,y)<<endl;
        }
    }
    return 0;
}

by _mi_ka_ @ 2023-08-24 08:20:20

ask 递归时变量没打对,此贴结。


|