萌新刚学线段树,全WA求帮调
查看原帖
萌新刚学线段树,全WA求帮调
450861
QcpyWcpyQ楼主2021/11/21 15:22

RTRT,代码如下:

#include<cstdio>
#define int long long
using namespace std;

const int N=1e6+5;
unsigned int n,m,a[N],ans[N<<2],tag[N<<2],x,y,k,op;

inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0' or ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' and ch<='9'){
		s=(s<<1)+(s<<3)+(ch^48);
		ch=getchar(); 
	}
	return f*s;
}

inline void build(int p,int l,int r){
    tag[p]=0;
    if(l==r){
		ans[p]=a[l];
		return;
	}
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    ans[p]=ans[p<<1]+ans[p<<1|1];
} 

inline void push_down(int p,int l,int r){
    int mid=(l+r)>>1;
    tag[p<<1]+=tag[p];
    ans[p<<1]+=tag[p<<1]*(mid-l+1);
    tag[p<<1|1]+=tag[p];
    ans[p<<1|1]+=tag[p<<1|1]*(r-mid);
    tag[p]=0;
}

inline void update(int x,int y,int l,int r,int p,int k){
    if(x<=l and r<=y){
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return;
    }
    push_down(p,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)update(x,y,l,mid,p<<1,k);
    if(y>mid) update(x,y,mid+1,r,p<<1|1,k);
    ans[p]=ans[p<<1]+ans[p<<1|1];
}

inline int query(int x,int y,int l,int r,int p){
    int res=0;
    if(x<=l and r<=y)return ans[p];
    int mid=(l+r)>>1;
    push_down(p,l,r);
    if(x<=mid)res+=query(x,y,l,mid,p<<1);
    if(y>mid) res+=query(x,y,mid+1,r,p<<1|1);
    return res;
}

signed main(){
	n=read(),m=read();
    for(int i=1;i<=n;i++)
    	a[i]=read();
    build(1,1,n);
    while(m--){
        op=read();
        if(op==1){
            x=read(),y=read(),k=read();
            update(x,y,1,n,1,k);
        }
        if(op==2){
            x=read(),y=read();
            printf("%lld\n",query(x,y,1,n,1));
        }
    }
    return 0;
}
2021/11/21 15:22
加载中...