为啥执行fill和ask就会挂
查看原帖
为啥执行fill和ask就会挂
575655
Chtholly_is_cute楼主2024/8/25 16:46

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;

}
2024/8/25 16:46
加载中...