30分求助
查看原帖
30分求助
457203
loliygh楼主2021/8/14 16:11
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,m,p,a[400005],t[400005],add[400005],mul[400005];
void build(ll k,ll l,ll r)
{
	mul[k]=1;
	if(l==r)
	{
		t[k]=a[l]%p;
		return ;
	}
	ll mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	t[k]=(t[k*2]+t[k*2+1])%p;
}
void pushdown(ll k,ll l,ll r)
{
	ll mid=(l+r)/2;
	t[k*2]=(t[k*2]*mul[k])%p;
	t[k*2+1]=(t[k*2+1]*mul[k])%p;
	t[k*2]=(t[k*2]+(mid-l+1)*add[k])%p;
	t[k*2+1]=(t[k*2+1]+(r-mid)*add[k])%p;
	mul[k*2]=(mul[k*2]*mul[k])%p;
	mul[k*2+1]=(mul[k*2+1]*mul[k])%p;
	add[k*2]=(add[k*2]+add[k])%p;
	add[k*2+1]=(add[k*2+1]+add[k])%p;
	add[k]=0,mul[k]=1;
}
void mul_modify(ll k,ll l,ll r,ll x,ll y,ll z)
{
	if(x<=l&&y>=r)
	{
		t[k]=(t[k]*z)%p;
		add[k]=(add[k]*z)%p;
		mul[k]=(mul[k]*z)%p;
		return ;
	}
	pushdown(k,l,r);
	ll mid=(l+r)/2;
	if(x<=mid) mul_modify(k*2,l,mid,x,y,z);
	if(mid<y) mul_modify(k*2+1,mid+1,r,x,y,z);
	t[k]=(t[k*2]+t[k*2+1])%p;
}
void add_modify(ll k,ll l,ll r,ll x,ll y,ll z)
{
	if(x<=l&&y>=r)
	{
		t[k]=(t[k]+(r-l+1)*z)%p;
		add[k]=(add[k]+z)%p;
		return ;
	}
	pushdown(k,l,r);
	ll mid=(l+r)/2;
	if(x<=mid) add_modify(k*2,l,mid,x,y,z);
	if(mid<y) add_modify(k*2+1,mid+1,r,x,y,z);
	t[k]=(t[k*2]+t[k*2+1])%p;
}
ll query(ll k,ll l,ll r,ll x,ll y)
{
	if(x<=l&&y>=r)
		return t[k]%p;
	pushdown(k,l,r);
	ll mid=(l+r)/2,res=0;
	if(x<=mid) res=(res+query(k*2,l,mid,x,y))%p;
	if(mid<y) res=(res+query(k*2+1,mid+1,r,x,y))%p;
	return res;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	for(ll i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(ll i=1;i<=m;i++)
	{
		ll opt,x,y,z;
		scanf("%lld%lld%lld",&opt,&x,&y);
		if(opt==1)
		{
			scanf("%lld",&z);
			mul_modify(1,1,n,x,y,z);
		}
		if(opt==2)
		{
			scanf("%lld",&z);
			add_modify(1,1,n,x,y,z);
		}
		if(opt==3)
			printf("%lld\n",query(1,1,n,x,y)%p);
	}
	return 0;
}
2021/8/14 16:11
加载中...