15昏,错在哪qwq
查看原帖
15昏,错在哪qwq
1251853
linglu1YGking楼主2025/7/23 10:23
#include<bits/stdc++.h>

#define ls (x*2)
#define rs (x*2+1)
#define ll long long

using namespace std;
const int N=1e5+5;
ll sum[N*4],tag[N*4];
int a[N];

void pushup(int x){
	sum[x]=sum[ls]+sum[rs];
	return ;
}
void pushdown(int x,int tl,int tr){
	if(tag[x]){
		ll &p=tag[x]; 
		int mid=(tl+tr)/2;
		tag[ls]+=p;
		tag[rs]+=p;
		sum[ls]+=p*(mid-tl+1);
		sum[rs]+=p*(tr-mid); 
		p=0;
	}
}
void qujianjia(int x,int tl,int tr,int l,int r,ll w){
	if(tl>=l && tr<=r){
		sum[x]+=(tr-tl+1)*w;
		tag[x]+=w;
		return ;
	}
	int mid=(tl+tr)/2;
	pushdown(x,tl,tr);
	if(mid>=l) qujianjia(ls,tl,mid,l,r,w);
	if(mid<r) qujianjia(rs,mid+1,tr,l,r,w);
	pushup(x); 
}

void build(int x,int tl,int tr){ 
	if(tl==tr){
		sum[x]=a[tl];
		return ;
	}
	
	int mid=(tl+tr)/2;
	build(ls,tl,mid);
	build(rs,mid+1,tr);
	
	pushup(x);
}

int query(int x,int tl,int tr,int l,int r){
	if(tl>=l && tr<=r) return sum[x];
    int mid=(tl+tr)/2;
    pushdown(x,tl,tr);
    ll s=0;
    if(mid>=l) s+=query(ls,tl,mid,l,r);
    if(mid<r) s+=query(rs,mid+1,tr,l,r);
    pushup(x);
    return s;
}

int main(){
	int n,m;
	int t=0;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%d",&t);
		if(t==1){
			int l=0,r=0;
			ll k=0;
			scanf("%d %d %d",&l,&r,&k);
			qujianjia(1,1,n,l,r,k);
		}
		else {
			int l=0,r=0;
			scanf("%d %d",&l,&r);
			cout<<query(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}
2025/7/23 10:23
加载中...