刚学2天线段树,只能过样例,求调
查看原帖
刚学2天线段树,只能过样例,求调
559502
TsH_GD楼主2022/11/12 22:51
#include<iostream>
#include<cstdio>

using namespace std;

const long long maxn=1e5+10;

long long n,m;
long long a[maxn];

struct segment_tree{
	
	struct Node{
		long long l,r;
		long long sum;
		long long lz;
	}tr[maxn*4];
	
	void build(long long p,long long l,long long r){
		tr[p]={l,r,0,0};
		
		if(l==r){
			tr[p].sum=a[l];
			return ;
		}
		
		long long mid=l+r>>1;
		build(p<<1,l,mid);
		build(p<<1|1,mid+1,r);
	}
	
	void add(long long p,long long l,long long r,long long k){
		if(tr[p].r<=r&&tr[p].l>=l){
			tr[p].sum+=k*(tr[p].r-tr[p].l+1);
			tr[p].lz+=k;
			return ;
		}
		
		pushdown(p);
		
		if(tr[p<<1].r>=l) add(p<<1,l,r,k);
		if(tr[p<<1|1].l<=r) add(p<<1|1,l,r,k);
		
		tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
	}
	
	void pushdown(long long p){
		if(tr[p].lz!=0){
			tr[p<<1].lz+=tr[p].lz;
			tr[p<<1|1].lz+=tr[p].lz;
			
			long long mid=tr[p].l+tr[p].r>>1;
			tr[p<<1].sum+=tr[p].lz*(mid-tr[p<<1].l+1);
			tr[p<<1|1].sum+=tr[p].lz*(tr[p<<1|1].r-mid);
			tr[p].lz=0;
		}
		return ;
	}
	
	long long mysearch(long long i,long long l,long long r){
		if(tr[i].l>=l && tr[i].r<=r)
			return tr[i].sum;
		if(tr[i].r<l || tr[i].l>r)  return 0;
		pushdown(i);
		long long s=0;
		if(tr[i*2].r>=l)  s+=mysearch(i*2,l,r);
		if(tr[i*2+1].l<=r)  s+=mysearch(i*2+1,l,r);
		return s;
	}

}ST;

int main(){
	scanf("%lld %lld",&n,&m);
	
	for(long long i=1;i<=n;i++) 
		scanf("%lld",&a[i]);
	
	ST.build(1,1,n);
	
	for(long long i=1;i<=m;i++){
		long long op;
		scanf("%lld",&op);
		if(op==1){
			long long x,y;
			long long k;
			scanf("%lld %lld %lld",&x,&y,&k);
			ST.add(1,x,y,k);
		}
		else{
			long long x,y;
			scanf("%lld %lld",&x,&y);
			printf("%lld\n",ST.mysearch(1,x,y));
		}
	}
}
2022/11/12 22:51
加载中...