求调,输出全是0
查看原帖
求调,输出全是0
1399334
sishenjinlian楼主2025/2/5 18:16
#include<bits/stdc++.h>
#define int long long 
int sum[100005],arr[100005],add[100005];
int n,m,c,a,b,k,ans;
bool update[10005];
void lazy(int x,int y,int i)
	{
		sum[x]=y*i;
		add[x]=y;
		update[x]=true;
	}
	void up(int i)
	{
		sum[i]=sum[i*2]+sum[i*2+1];
	}
	void down(int i,int ln,int rn)
	{
		if(update[i])
		{
			lazy(i*2,add[i],ln);
			lazy(i*2+1,add[i],rn);
			update[i]=false;
		}
	}
	
	int build(int l,int r,int i) 
	{
		if(l==r)
		{
			return sum[i]=arr[l];
		}
		else
		{
			int mid=(r+l)/2;
			build(l,mid,i*2);
			build(mid+1,r,i*2+1);
			up(i);
		}
		add[i]=0;
		update[i]=false;
	}
	int search(int i,int jobl,int jobr,int l,int r)
	{
		
		if(jobl<=l&&r<=jobr)
{
	return sum[i];
	}
	else {
		int mid=(l+r)/2;
		down(i,mid-l+1,r-mid);
		if(jobl<=mid)
		{
			ans+=search(i*2,jobl,jobr,l,mid);
		}
			if(jobr>mid)
		{
			ans+=search(i*2+1,jobl,jobr,mid+1,r);
		}
		
	}return ans;
		}
	void addn(int jobl,int jobr,int jobv,int l,int r,int i)
	{	
	
		if(jobl<=l&&r<=jobr)
		{
			lazy(i,jobv,r-l+1);
		}
		else
		{int mid=(r+l)/2;
		down(i,mid-l+1,r-mid);
		if(jobl<=mid){addn(jobl,jobr,jobv,l,mid,i*2);
		}
		if(jobl>mid){	addn(jobl,jobr,jobv,mid+1,r,i*2+1);
		}
		//up[i];
		}
	}
	signed main(){
		scanf("%lld %lld",&n,&m);
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&arr[i]);
		}
		build(1,n,1);
		for(int i=1;i<=m;i++)
		{
			scanf("%lld %lld %lld",&c,&a,&b);
			if(c==1)
			{
				scanf("%lld",&k);
				addn(1,n,k,c,a,1);
			}
			if(c==2)
			{
				search(1,1,n,a,b);
				
				printf("%lld\n",ans);
				ans=0;
			}
		}
		return 0;
	}
		
		
2025/2/5 18:16
加载中...