线段树不能读入完

P3372 【模板】线段树 1

tiankong153 @ 2023-10-10 17:29:35

#include<bits/stdc++.h>
using namespace std;
long long d[40008],add[40008];
int n,m;
int a,b,flag;
long long c;
void build(int k,int l,int r){
    if(l==r){
        scanf("%lld%",&d[k]);
        return;
    }
    int mid=l+((r-l)>>1);
    build(2*k,l,mid),build(2*k+1,mid+1,r);
    d[k]=d[k*2]+d[k*2+1];
}
void Add(int k,int l,int r,int v){
    add[k]+=v;
    d[k]+=(r-l+1)*v;
    return;
}
void pushdown(int k,int l,int r,int mid){
    if(add[k]!=0){
        d[k*2]+=add[k]*(mid-l+1);
        d[k*2+1]+=add[k]*(r-mid);
        add[k*2]+=add[k];
        add[k*2+1]+=add[k];
        add[k]=0;
    }
}
void change(int k,int l,int r,int x,int y,int v){
    if(l>r)
    return;            
    if(x<=l&&y>=r)Add(k,l,r,v);
    int mid=(l+r)>>1;
    pushdown(k,l,r,mid);
    if(x<=mid)change(2*k,l,mid,x,y,v);
    if(y>mid)change(2*k+1,mid+1,r,x,y,v);
    d[k]=d[k*2]+d[k*2+1];
}
long long getsum(int k,int l,int r,int x,int y){
    if(x<=l&&y>=r)return d[k];
    int mid=(l+r)>>1;
    long long res=0;
    if(x<=mid)res+=getsum(2*k,l,mid,x,y);
    if(y>mid)res+=getsum(2*k+1,mid+1,r,x,y);
    return res;
}
int main(){
    cin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&flag,&a,&b);
        if(flag==1){
            scanf("%lld",&c);
            change(1,1,n,a,b,c);
        }
        if(flag==2)
        printf("%lld\n",getsum(1,1,n,a,b));
    }
    return 0;
}

各位神犇们真的改不出来了

运行有问题


by Misophiliac @ 2023-10-10 17:39:14

@tiankong153

  1. 关于 \texttt{RE} 的问题,change() 第二个判断里要 return
  2. 要使答案正确,还需要在 getsum() 里声明 midpushdown 一次。

by tiankong153 @ 2023-10-10 17:41:50

@yuanxiuan 改出来了,谢谢


|