30pts求助
查看原帖
30pts求助
169594
Heart_Of_Iron_4楼主2022/8/11 11:30

rt,AC #1,#3,#4

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll a[400100],n,ta[100100],add[400100],multi[400100],t1,t2,t3,t4,p,m,maxx;
void broke(ll l,ll r,ll k)
{
	//printf("break:%lld %lld %lld\n",l,r,k);
	a[k]*=multi[k];
	a[k]%=p;
	a[k]+=add[k];
	int mid=(l+r)/2;
	if(k*2<=maxx)multi[k*2]*=multi[k],add[k*2]*=multi[k];
	if(k*2+1<=maxx)multi[k*2+1]*=multi[k],add[k*2+1]*=multi[k];
	if(k*2<=maxx)add[k*2]+=add[k]/(r-l+1)*(mid-l+1);
	if(k*2+1<=maxx)add[k*2+1]+=add[k]/(r-l+1)*(r-mid);
	add[k]=0;
	multi[k]=1;
	a[k]%=p;
}
ll build(ll l,ll r,ll k)
{
	multi[k]=1;
	maxx=max(maxx,k);
	if(l==r)a[k]=ta[l];
	else a[k]=build(l,(l+r)/2,k*2)+build((l+r)/2+1,r,k*2+1);
	a[k]%=p;
	return a[k];
}
ll sum(ll k,ll l,ll r,ll x,ll y)
{
	broke(l,r,k);
	//printf("sum:%lld %lld %lld %lld %lld\n",k,l,r,x,y);
	if(l>r||x>y||l>y||x>r)return 0;
	if(l==x&&r==y)return a[k];
	ll mid=(l+r)/2;
	return (sum(k*2,l,mid,x,min(y,mid))+sum(k*2+1,mid+1,r,max(x,mid+1),y))%p;
}
void addd(ll k,ll l,ll r,ll x,ll y,ll z)
{
	broke(l,r,k);
	//printf("add:%lld %lld %lld %lld %lld %lld\n",k,l,r,x,y,z);
	if(l>r||x>y||l>y||x>r)return;
	if(l==x&&r==y)
	{
		add[k]=z;
		return;
	}
	if(l<=x&&y<=r)a[k]+=z;
	a[k]%=p;
	ll mid=(l+r)/2;
	addd(k*2,l,mid,x,min(y,mid),z/(y-x+1)*(min(y,mid)-x+1)),addd(k*2+1,mid+1,r,max(x,mid+1),y,z/(y-x+1)*(y-max(x,mid+1)+1));
}
ll multii(ll k,ll l,ll r,ll x,ll y,ll z)
{
	broke(l,r,k);
	//printf("multi:%lld %lld %lld %lld %lld %lld\n",k,l,r,x,y,z);
	if(l>r||x>y||l>y||x>r)
	{
		return a[k];
//		printf("multi:%lld %lld %lld %lld %lld %lld  return %lld\n",k,l,r,x,y,z,a[k]);
	}
	if(l==x&&r==y)
	{
		multi[k]=z;
//		printf("multi:%lld %lld %lld %lld %lld %lld  return %lld\n",k,l,r,x,y,z,a[k]*z);
		return (a[k]*z)%p;
	}
	ll mid=(l+r)/2;
	ll t114514=multii(k*2,l,mid,x,min(y,mid),z)+multii(k*2+1,mid+1,r,max(x,mid+1),y,z);
	t114514%=p;
	if(l<=x&&y<=r)
	{
		a[k]=t114514;
	}
//	printf("multi:%lld %lld %lld %lld %lld %lld  return %lld\n",k,l,r,x,y,z,t114514);
	return t114514;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	for(ll i=1;i<=n;++i)scanf("%lld",&ta[i]);
	build(1,n,1);
	while(m--)
	{
		scanf("%lld",&t1);
		if(t1==3)
		{
			scanf("%lld%lld",&t2,&t3);
			printf("%lld\n",sum(1,1,n,t2,t3));
		}
		else if(t1==2)
		{
			scanf("%lld%lld%lld",&t2,&t3,&t4);
			addd(1,1,n,t2,t3,(t3-t2+1)*t4);
		}
		else
		{
			scanf("%lld%lld%lld",&t2,&t3,&t4);
			multii(1,1,n,t2,t3,t4%p);
		}
		/*printf("\na[i](%lld):",maxx);
		for(ll i=1;i<=maxx;++i)printf("%lld ",a[i]);
		printf("\nadd[i](%lld):",maxx);
		for(ll i=1;i<=maxx;++i)printf("%lld ",add[i]);
		printf("\nmulti[i](%lld):",maxx);
		for(ll i=1;i<=maxx;++i)printf("%lld ",multi[i]);*/
	}
	return 0;
}
2022/8/11 11:30
加载中...