模板写炸,求助
查看原帖
模板写炸,求助
390770
S0CRiA楼主2021/1/17 20:53

#1AC其他WA

//P3372
#include <cstdio>
const long long maxn=100005;
struct node{long long l,r,value,lazy;}t[maxn<<2];
long long a[maxn];

void pushup(long long node){
	t[node].value=t[node<<1].value+t[node<<1|1].value;
	return;
}
void pushdown(long long node){
	if(t[node].lazy){
//		if(t[node].l!=t[node].r){
			t[node<<1].lazy=t[node].lazy;
			t[node<<1|1].lazy=t[node].lazy;
			t[node<<1].value+=t[node<<1].lazy*(t[node<<1].r-t[node<<1].l+1);
			t[node<<1|1].value+=t[node<<1|1].lazy*(t[node<<1|1].r-t[node<<1|1].l+1);
//		}
		t[node].lazy=0;
	}
	return;
}
void buildtree(long long l,long long r,long long node){
	t[node].l=l;
	t[node].r=r;
	if(l==r){
		t[node].value=a[l];
		return;
	}
	long long m=l+((r-l)>>1);
	buildtree(l,m,node<<1);
	buildtree(m+1,r,node<<1|1);
	pushup(node);
	return;
}
void add(long long l1,long long r1,long long v,long long l,long long r,long long node){
	if(l1<=l && r<=r1){
		t[node].lazy+=v;
		t[node].value+=t[node].lazy*(t[node].r-t[node].l+1);
		return;
	}
	pushdown(node);
	long long m=l+((r-l)>>1);
	if(l1<=m) add(l1,r1,v,l,m,node<<1);
	if(m<r1)  add(l1,r1,v,m+1,r,node<<1|1);
	pushup(node);
	return;
} 
long long query(long long l1,long long r1,long long l,long long r,long long node){
	int ret=0;
	if(l1<=l && r<=r1){
		return t[node].value;
	}
	pushdown(node);
	long long m=l+((r-l)>>1);
	if(l1<=m) ret+=query(l1,r1,l,m,node<<1);
	if(m<r1)  ret+=query(l1,r1,m+1,r,node<<1|1);
	return ret;
}

int main(){
	long long n,m,opt,x,y,k;
	scanf("%lld %lld",&n,&m);
	for(long long i=1; i<=n; ++i)
		scanf("%lld",&a[i]);
	buildtree(1,n,1);
	for(long long i=0; i<m; ++i){
		scanf("%lld %lld %lld",&opt,&x,&y);
		switch(opt){
			case 1:
				scanf("%lld",&k);
				add(x,y,k,1,n,1);
				break;
			case 2:
				printf("%lld\n",query(x,y,1,n,1));
				break;
		}
	}
	return 0;
}
2021/1/17 20:53
加载中...