为什么一个一个求和答案正确,区间求和就不对
查看原帖
为什么一个一个求和答案正确,区间求和就不对
1480034
hfls_80504楼主2025/2/3 10:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[100009];
int s[400009];
int tag[400009];
void pushdown(int p,int l,int r,int mid){
	if(l==r) return;
	if(tag[p]){
		tag[p<<1]+=tag[p];
		tag[p<<1|1]+=tag[p];
		s[p<<1]+=tag[p]*(mid-l+1);
		s[p<<1|1]+=tag[p]*(r-mid);
		tag[p]=0;
	}
}
void build(int p,int l,int r){
	tag[p]=0;
	if(l==r){
		s[p]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	s[p]=s[p<<1]+s[p<<1|1];
}
void add(int p,int l,int r,int x,int y,int w){
	if(x<=l&&r<=y){
		tag[p]+=w;
		s[p]+=(r-l+1)*w;
		return;
	}
	int mid=l+r>>1;
	pushdown(p,l,r,mid);
	if(x<=mid){
		add(p<<1,l,mid,x,y,w);
	}
	if(y>mid){
		add(p<<1|1,mid+1,r,x,y,w);
	}
	s[p<<1]+=tag[p]*(mid-l+1);
	s[p<<1|1]+=tag[p]*(r-mid);
}
int sum(int p,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return s[p];
	}
	int mid=l+r>>1,ans=0;
	pushdown(p,l,r,mid);
	if(x<=mid) ans+=sum(p<<1,l,mid,x,y);
	if(y>mid) ans+=sum(p<<1|1,mid+1,r,x,y);
	return ans;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,x,y,k;
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			add(1,1,n,x,y,k);
		}
		if(op==2){
			cin>>x>>y;
			cout<<sum(1,1,n,x,y)<<endl;
		}
		for(int i=1;i<=n;i++){
			cout<<sum(1,1,n,i,i)<<" ";
		}
		cout<<endl;
	} 
	return 0;
} 
2025/2/3 10:26
加载中...