95pts,WA on #20,玄关求条
查看原帖
95pts,WA on #20,玄关求条
1105009
Yangxixuan楼主2025/7/23 11:08
#include <cstdio>
#include <iostream>
#define ls (x*2)
#define rs (x*2+1)
#define ll unsigned long long
using namespace std;
const int MAXN=1e6+5;
int n,m;
ll tree[MAXN],a[MAXN],tag[MAXN];
void pushup(int x){
	tree[x]=tree[ls]+tree[rs];
}
void build(int x,int l,int r){
	if(l==r){
		tree[x]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(x);
}
void pushdown(int l,int r,int x){
	if(tag[x]){
		ll &p=tag[x];
		int mid=(l+r)>>1;
		tag[ls]+=p,tag[rs]+=p;
		tree[ls]+=p*(mid-l+1),tree[rs]+=p*(r-mid);
		p=0;
	}
}
void add(int l,int r,ll c,int tl,int tr,int x){
	if(l<=tl&&tr<=r){
		tree[x]+=(tr-tl+1)*c;
		tag[x]+=c;
		return;
	}
	int mid=(tl+tr)>>1;
	pushdown(tl,tr,x);
	if(mid>=l) add(l,r,c,tl,mid,ls);
	if(r>mid) add(l,r,c,mid+1,tr,rs);
	pushup(x);
}
ll query(int l,int r,int tl,int tr,int x){
	if(l<=tl&&tr<=r) return tree[x];
	int mid=(tl+tr)>>1;
	pushdown(tl,tr,x);
	ll sum=0;
	if(l<=mid) sum+=query(l,r,tl,mid,ls);
	if(r>mid) sum+=query(l,r,mid+1,tr,rs);
	return sum;
}
int main(){
//	freopen("P3372_20.in","r",stdin);
//	freopen("1.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		int p,x,y,k;
		scanf("%d",&p);
		if(p==1){
			scanf("%d%d%d",&x,&y,&k);
			add(x,y,k,1,n,1);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(x,y,1,n,1));
		}
	}
	return 0;
}
2025/7/23 11:08
加载中...