只有三十分,自己编的数据都是对的
查看原帖
只有三十分,自己编的数据都是对的
1398621
all_for_god楼主2024/7/20 14:52
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,q,tree[500005],lazysum[500005],lazychen[500005],a[500005];

ll ls(ll h)
{
	return h*2;
}
ll rs(ll h)
{
	return h*2+1;
}
ll build(ll l,ll r,ll h)
{
	lazychen[h]=1;lazysum[h]=0;
	if(l==r) 
	{
		tree[h]=a[l]%m;return 0;
	}
	ll mid=(l+r)>>1;
	build(l,mid,ls(h));
	build(mid+1,r,rs(h));
	tree[h]=(tree[ls(h)]+tree[rs(h)])%m;
	return 0;
}

ll push_up(ll h)
{
	tree[h]=(tree[ls(h)]+tree[rs(h)])%m;return 0;
}

ll f(ll l,ll r,ll h,ll k1,ll k2)
{
	tree[h]=(tree[h]*k1+k2*(r-l+1))%m;
	lazychen[h]*=k1%m,lazysum[h]=(lazysum[h]*k1+k2)%m;
	return 0;
}

ll push_down(ll l,ll r,ll h)
{
	ll mid=(l+r)>>1;
	f(l,mid,ls(h),lazychen[h],lazysum[h]);
	f(mid+1,r,rs(h),lazychen[h],lazysum[h]);
	lazychen[h]=1,lazysum[h]=0;
	return 0;
}

ll chen(ll l,ll r,ll s,ll t,ll h,ll k)
{
	if(l>=s&&r<=t)
	{
		tree[h]=((tree[h]%m)*k)%m;
		lazychen[h]*=k%m,lazysum[h]*=k%m;return 0;
	}
	push_down(l,r,h);
	ll mid=(l+r)>>1;
	if(mid>=s) chen(l,mid,s,t,ls(h),k);
	if(mid<t) chen(mid+1,r,s,t,rs(h),k);
	push_up(h);
	return 0;
}

ll add(ll l,ll r,ll s,ll t,ll h,ll k)
{
	//printf("%lld %lld %lld %lld\n",l,r,h,k);
	
	if(l>=s&&r<=t)
	{
		tree[h]=((tree[h]%m)+k*(r-l+1))%m;
		lazysum[h]=(lazysum[h]+k)%m;return 0;
	}
	push_down(l,r,h);
	ll mid=(l+r)>>1;
	if(mid>=s) add(l,mid,s,t,ls(h),k);
	if(mid<t) add(mid+1,r,s,t,rs(h),k);
	push_up(h);
	return 0;
}

ll getsum(ll l,ll r,ll s,ll t,ll h)
{
	//printf("%lld %lld %lld %lld\n",l,r,h,tree[h]);
	if(l>=s&&r<=t) return tree[h];
	push_down(l,r,h);
	ll ans=0,mid=(l+r)>>1;
	if(mid>=s) ans+=getsum(l,mid,s,t,ls(h));
	if(mid<t) ans+=getsum(mid+1,r,s,t,rs(h));
	return (ans%m);
}

int main()
{
	scanf("%lld %lld %lld",&n,&q,&m);
	//for(int i=1;i<=100005;i++) lazychen[i]=1;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	for(int i=1;i<=q;i++)
	{
		ll op,x,y,k;
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			chen(1,n,x,y,1,k);
		}
		if(op==2)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,n,x,y,1,k);
		}
		if(op==3)
		{
			scanf("%lld%lld",&x,&y);
			ll ans=getsum(1,n,x,y,1);
			ans=ans%m; 
			printf("%lld\n",ans);
		}
	}
	return 0;
}

求调

2024/7/20 14:52
加载中...