全WA求条
查看原帖
全WA求条
222431
Atlantic_C929楼主2024/8/14 14:12

qwq

build建树

f懒标记下放

mul乘法

add加法

ans求答案

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,x,y,z,mod,a[100010];
struct tree
{
	long long l,r,pre,add,mul=1;
}t[400010];
long long f(long long p)
{
	t[p*2].pre=(t[p*2].pre*t[p].mul+t[p].add*(t[p*2].r-t[p*2].l+1))%mod;
	t[p*2+1].pre=(t[p*2+1].pre*t[p].mul+t[p].add*(t[p*2+1].r-t[p*2+1].l+1))%mod;
	if(t[p].mul!=1)
	{
		t[p*2].mul=t[p*2].mul*t[p].mul%mod;
		t[p*2+1].mul=t[p*2+1].mul*t[p].mul%mod;
	}
	t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%mod;
	t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%mod;
	t[p].add=0;
	t[p].mul=1;
	return 0;
}
long long build(long long p,long long l,long long r)
{
	t[p].l=l;
	t[p].r=r;
	if(l==r)
	{
		t[p].pre=a[l]%mod;
		return 0;
	}
	long long mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
	return 0;
}
long long add(long long p,long long l,long long r,long long num)
{
	if(l<=t[p].l && t[p].r<=r)
	{
		t[p].pre=(t[p].pre+num*(t[p].r-t[p].l+1))%mod; 
		t[p].add=(t[p].add+num)%mod;
		return 0;
	}
	f(p);
	long long mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
		add(p*2,l,mid,num);
	if(r>mid)
		add(p*2+1,mid+1,r,num);
	t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
	return 0;
}
long long mul(long long p,long long l,long long r,long long num)
{
	if(l<=t[p].l && t[p].r<=r)
	{
		t[p].pre=t[p].pre*num%mod;
		t[p].add=t[p].add*num%mod;
		t[p].mul=t[p].mul*num%mod;
		return 0;
	}
	f(p);
	long long mid=(t[p].l+t[p].r)>>1;
	if(l<=mid)
		mul(p*2,l,mid,num);
	if(r>mid)
		mul(p*2+1,mid+1,r,num);
	t[p].pre=(t[p*2].pre+t[p*2+1].pre)%mod;
	return 0;
}
long long ans(long long p,long long l,long long r)
{
	if(l<=t[p].l && t[p].r<=r)
		return t[p].pre%mod;
	f(p);
	long long mid=(t[p].l+t[p].r)>>1,sum=0;
	if(l<=mid)
		sum=(sum+ans(p*2,l,mid))%mod;
	if(r>mid)
		sum=(sum+ans(p*2+1,mid+1,r))%mod;
	return sum%mod;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(long long i=1;i<=n;i++)
		scanf("%lld",a+i);
	build(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		scanf("%lld",&k);
		if(k==1)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			z%=mod;
			mul(1,x,y,z);
		}
		if(k==2)
		{
			scanf("%lld%lld%lld",&x,&y,&z);
			z%=mod;
			add(1,x,y,z);
		}
		if(k==3)
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",ans(1,x,y)%mod);
		}
	}
	return 0;
}
2024/8/14 14:12
加载中...