线段树2求条
查看原帖
线段树2求条
305069
wangjiawen楼主2025/2/7 17:24

已查明为懒标记的问题,求条。

马蜂一坨,为了您的身体健康不建议久看。

#include<bits/stdc++.h>
using namespace std;
struct node{
	long long l,r,num;
	long long sum,tagplus,tagmult;
}tree[800001];
long long n,m,mod,a[100001];
long long build(long long l,long long r,long long s)
{
	tree[s].num=s;tree[s].l=l;tree[s].r=r;tree[s].tagmult=1;
	if(l==r)
	{
		tree[s].sum=a[l];
		return a[l];
	}
	long long mid=(l+r)/2;
	build(l,mid,s*2);build(mid+1,r,s*2+1);
	tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
	return tree[s].sum;
}
void pplus(long long l,long long r,long long sum,long long s)
{
	if(tree[s].l>r||tree[s].r<l)
		return ;
	if(tree[s].l>=l&&tree[s].r<=r)
	{
		(tree[s].sum+=((sum*(tree[s].r-tree[s].l+1))))%=mod;
		(tree[s].tagplus+=sum)%=mod;
		return ;
	}
	pplus(l,r,sum,s*2);pplus(l,r,sum,s*2+1);
	tree[s].sum=(tree[s*2].sum+tree[s*2+1].sum)%mod;
}
void mmult(long long l,long long r,long long sum,long long s)
{
	if(tree[s].l>r||tree[s].r<l)
		return ;
	if(tree[s].l>=l&&tree[s].r<=r)
	{
		(tree[s].sum*=sum)%=mod;
		(tree[s].tagmult*=sum)%=mod;
		(tree[s].tagplus*=sum)%=mod;
		return ;
	}
	mmult(l,r,sum,s*2);mmult(l,r,sum,s*2+1);
	tree[s].sum=(tree[s*2].sum+tree[s*2+1].sum)%mod;
}
long long fun(long long l,long long r,long long s)
{
	if(tree[s].l>r||tree[s].r<l)
		return 0;
	if(tree[s].l>=l&&tree[s].r<=r)
		return tree[s].sum;
	if(tree[s].tagmult!=1)
	{
		(tree[s*2].sum*=tree[s].tagmult)%=mod;(tree[s*2+1].sum*=tree[s].tagmult)%=mod;
		(tree[s*2].tagmult*=tree[s].tagmult)%=mod;(tree[s*2+1].tagmult*=tree[s].tagmult)%=mod;
		(tree[s*2].tagplus*=tree[s].tagmult)%=mod;(tree[s*2+1].tagplus*=tree[s].tagmult)%=mod;
		tree[s].tagmult=1;
	}
	if(tree[s].tagplus!=0)
	{
		(tree[s*2].sum+=(tree[s].tagplus*(tree[s*2].r-tree[s*2].l+1)))%=mod;(tree[s*2+1].sum+=(tree[s].tagplus*(tree[s*2+1].r-tree[s*2+1].l+1)))%=mod;
		(tree[s*2].tagplus+=tree[s].tagplus)%=mod;(tree[s*2+1].tagplus+=tree[s].tagplus)%=mod;
		tree[s].tagplus=0;
	}
	long long sum=0;
	(sum+=fun(l,r,s*2))%=mod;
	(sum+=fun(l,r,s*2+1))%=mod;
	return sum;
}
int main()
{
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		long long op,x,y,z;
		cin>>op>>x>>y;
		if(op==3)
			cout<<fun(x,y,1)<<endl;
		else
		{
			cin>>z;
			z%=mod;
			if(op==2)
				pplus(x,y,z,1);
			if(op==1)
				mmult(x,y,z,1);
		}
		cout<<endl<<i<<"!!!\n";
		for(int j=1;j<=2*n;j++)
			cout<<tree[j].l<<" "<<tree[j].r<<" "<<tree[j].sum<<" "<<tree[j].tagmult<<" "<<tree[j].tagplus<<endl;
		cout<<endl<<endl;
	}
	return 0;
}

2025/2/7 17:24
加载中...