为啥执行fill和ask就会挂

P3372 【模板】线段树 1

Chtholly_is_cute @ 2024-08-25 16:46:01

code:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000001;
struct tree{
        int l,r;
        long long val,upd;
}a[MAXN<<2];//鍏堝簭閬嶅巻
long long b[MAXN];
void build(int l,int r,int cur){
        a[cur].l=l;
        a[cur].r=r;
        if(l==r){
                a[cur].val=b[l];
                return;
        }
        int mid=l+r>>1;
        build(l,mid,cur*2);
        build(mid+1,r,cur*2+1);
        a[cur].val=a[cur<<1].val+a[cur*2+1].val;
        return ;
}
void pushdown(int cur){
        if(a[cur].upd){
                a[cur<<1].val+=a[cur].upd*(a[cur<<1].r-a[cur<<1].l+1);
                a[(cur<<1)+1].val+=a[cur].upd*(a[cur*2+1].r-a[cur*2+1].l+1);
                a[cur*2].upd+=a[cur].upd;
                a[cur*2+1].upd+=a[cur].upd;
                a[cur].upd=0;
        }
}
void fill(int cur,int x,int y,int z){
        if(x<=a[cur].l&&y>=a[cur].r){
                a[cur].val+=(long long)z*(a[cur].r-a[cur].l+1);
                a[cur].upd+=z;
                return;
        }
        pushdown(cur);
        int mid=a[cur].l+a[mid].r;
        mid>>=1;
        if(x<=mid)fill(cur>>1,x,y,z);
        if(y>mid)fill((cur>>1)+1,x,y,z);
        a[cur].val=a[cur<<1].val+a[(cur<<1)+1].val;
}
long long ask(int cur,int x,int y){
        if(x<=a[cur].l&&y>=a[cur].r)return a[cur].val;
        pushdown(cur);
        int mid=a[cur].r-a[cur].l+1;
        long long ans=0;
        if(x<=mid)ans+=ask(cur*2,x,y);
        if(y>mid)ans+=ask(cur*2+1,x,y);
        return ans;
}
int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%lld",b+i);
        build(1,n,1);
        for(int i=1;i<=m;i++){
                int q,w,e,r;
                scanf("%d",&q);
                if(q==1){
                        scanf("%d%d%d",&w,&e,&r);
                        fill(1,w,e,r);
                }
                if(q==2){
                        scanf("%d%d",&w,&e);
                        cout<<ask(1,w,e)<<endl;
                }
        }
        return 0;

}

by _ZHZ_ @ 2024-09-08 22:01:39

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,x,y,k,op,a[N];
struct{
    int Left,Right;
    long long data,add;
}t[N*4];
void Build_Tree(int p,int Left,int Right){
    t[p].Left=Left;
    t[p].Right=Right;
    if(Left==Right){
        t[p].data=a[Left];
        return;
    }
    else{
        int mid=(Left+Right)/2;
        Build_Tree(p*2,Left,mid);
        Build_Tree(p*2+1,mid+1,Right);
        t[p].data=t[p*2].data+t[p*2+1].data;
    }
}
void spread(int p){
    if(t[p].add){
        t[p*2].data+=t[p].add*(t[p*2].Right-t[p*2].Left+1);
        t[p*2+1].data+=t[p].add*(t[p*2+1].Right-t[p*2+1].Left+1);
        t[p*2].add+=t[p].add;
        t[p*2+1].add+=t[p].add;
        t[p].add=0; 
    } 
}
void Change_Value(int p,int L,int R,int d){
    if(L<=t[p].Left&&R>=t[p].Right){
        t[p].data+=(long long)d*(t[p].Right-t[p].Left+1);
        t[p].add+=d;
        return;
    }
    spread(p);
    int mid=(t[p].Left+t[p].Right)/2;
    if(L<=mid) Change_Value(p*2,L,R,d);
    if(R>mid) Change_Value(p*2+1,L,R,d);
    t[p].data=t[p*2].data+t[p*2+1].data;
}
long long Ask(int p,int Left,int Right){
    if(Left<=t[p].Left&&Right>=t[p].Right) return t[p].data;
    spread(p);
    int mid=(t[p].Left+t[p].Right)/2;
    long long ans=0;
    if(Left<=mid) ans+=Ask(p*2,Left,Right);
    if(Right>mid) ans+=Ask(p*2+1,Left,Right);
    return ans; 
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    Build_Tree(1,1,n);
    for(int i=1;i<=m;i++){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d%d",&x,&y,&k);
            Change_Value(1,x,y,k);
        }
        else{
            scanf("%d%d",&x,&y);
            printf("%lld\n",Ask(1,x,y));
        }
    }
    return 0;
}

|