最后三点WA了

P3372 【模板】线段树 1

pjfffb @ 2023-11-01 21:31:35

大佬帮忙看看代码

求助

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
long long n,m,a[N],b,x,y,v;
long long res;
struct node{
    long long l,r,w,f;
}tree[4*N+1];
void build(int k,int l,int r) 
{
    tree[k].l=l,tree[k].r=r;
    if(tree[k].l==tree[k].r)
    {
        tree[k].w=a[l];
        return;
    }
    int m=(l+r)/2;
    build(k*2,l,m);
    build(k*2+1,m+1,r);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void down(int k){
    tree[k*2].f+=tree[k].f;
    tree[k*2+1].f+=tree[k].f;
    tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
    tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
    tree[k].f=0;
}
void add(int k){
    if(tree[k].l>y||tree[k].r<x) return;
    if(tree[k].l>=x&&tree[k].r<=y){
        tree[k].w+=(tree[k].r-tree[k].l+1)*v;
        tree[k].f+=v;
        return;
    }
    if(tree[k].f>0) down(k);
    int mid=(tree[k].l+tree[k].r)/2;
    if(x<=mid) add(2*k);
    if(y>mid) add(2*k+1);
    tree[k].w=tree[2*k].w+tree[2*k+1].w;
}

int ask(int x,int y,int k)
{
    if(tree[k].l>y||tree[k].r<x) return 0;
    if(tree[k].l>=x&&tree[k].r<=y) return tree[k].w;
    if(tree[k].f>0) down(k);
    return (long long)ask(x,y,k*2)+ask(x,y,k*2+1);
}
int main(){
    //freopen("1.in","r",stdin);
    //freopen("1.out","w",stdout);
    cin>>n,cin>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    while(m--){
        cin>>b,cin>>x,cin>>y;
        res=0;
        if(b==1){
            cin>>v;
            add(1);
        }
        else printf("%lld\n",ask(x,y,1));
    }
}

by Dawn_chen @ 2023-11-01 21:42:14

ask 函数定义为 long long 类型也可以

@pjfffb


by Dawn_chen @ 2023-11-01 21:43:24

不然的话 ask 函数还是会返回 int 类型


by pjfffb @ 2023-11-02 18:36:47

@Dawn_chen 可以了,谢谢大佬指点


|