RE求调
查看原帖
RE求调
1277916
Shensiyuan888楼主2025/7/31 19:07

不知道哪错了,求助。。。

#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
ll n,m,tr[maxn*4],a[maxn],add[maxn*4];
void Add(ll k,ll l,ll r,ll x){
	add[k]+=x;
	tr[k]+=(r-l+1)*x;
	return;
}
void pushdown(ll k,ll l,ll r){
	if(add[k]==0) return;
	ll mid=l+r>>1;
	Add(k<<1,l,mid,add[k]);
	Add(k<<1|1,mid+1,r,add[k]);
	add[k]=0;
}
void build(ll k,ll l,ll r){
	if(l==r){
		tr[k]=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	tr[k]=tr[k<<1]+tr[k<<1|1];
}
void modify(ll k,ll l,ll r,ll x,ll y,ll v){
	if(l>=x&&r<=y) Add(k,l,r,v);
	ll mid=l+r>>1;
	pushdown(k,l,r);
	if(x<=mid) modify(k<<1,l,mid,x,y,v);
	if(y>mid) modify(k<<1|1,mid+1,r,x,y,v);
	tr[k]=tr[k<<1]+tr[k<<1|1];
}
ll query(ll k,ll l,ll r,ll x,ll y){
	if(l>=x&&r<=y) return tr[k];
	ll mid=l+r>>1,res=0;
	pushdown(k,l,r);
	if(x<=mid) res+=query(k<<1,l,mid,x,y);
	if(mid<y) res+=query(k<<1|1,mid+1,r,x,y);
	return res;
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		int num,x,y,k;
		cin>>num;
		if(num==1){
			cin>>x>>y>>k;
			modify(1,1,n,x,y,k);
		}
		else{
			cin>>x>>y;
			cout<<query(1,1,n,x,y)<<"\n";
		}
	}
	return 0; 
} 
2025/7/31 19:07
加载中...