调了3天,全Wa,求助大佬qwq
查看原帖
调了3天,全Wa,求助大佬qwq
208161
penghongxiang楼主2022/7/13 11:21
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=100010;
ll n,m,p,a[maxn],cnt=0;
struct xds
{
	ll l,r,sum,add,mul;
}tr[maxn*4];
void push_up(ll u)
{
	tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%p;
}
void push_down(ll u)
{
	tr[u<<1].add=(tr[u<<1].add*tr[u].mul+tr[u].add)%p;
	tr[u<<1].mul=(tr[u].mul*tr[u<<1].mul)%p;
	tr[u<<1].sum=(tr[u<<1].sum*tr[u].mul+(tr[u<<1].r-tr[u<<1].l+1)*tr[u].add%p)%p;
	tr[u<<1|1].add=(tr[u<<1|1].add*tr[u].mul+tr[u].add)%p;
	tr[u<<1|1].mul=(tr[u].mul*tr[u<<1].mul)%p;
	tr[u<<1|1].sum=(tr[u<<1|1].sum*tr[u].mul+(tr[u<<1|1].r-tr[u<<1|1].l+1)*tr[u].add%p)%p;
	tr[u].add=0;
	tr[u].mul=1;
}
void build(ll l,ll r,ll u)
{
	tr[u].l=l,tr[u].r=r,tr[u].mul=1;
	++cnt;
	if(l==r)
	{
		tr[u].sum=a[l]%p;
		return ; 
	}
	ll mid=l+r>>1;
	build(l,mid,u<<1);
	build(mid+1,r,u<<1|1);
	push_up(u);
}
void cf(ll u,ll l,ll r,ll w)
{
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		tr[u].add=w*tr[u].add%p;
		tr[u].mul=w*tr[u].mul%p;
		tr[u].sum=w*tr[u].sum%p;
		return ;
	}
	push_down(u);
	ll mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)
	{
		cf(u<<1,l,r,w);
	}
	if(r>mid)
	{
		cf(u<<1|1,l,r,w);
	}
	push_up(u);
}
void jf(ll u,ll l,ll r,ll w)
{
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		tr[u].add=(tr[u].add+w)%p;
		tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*w)%p;
		return ;
	}
	push_down(u);
	ll mid=tr[u].l+tr[u].r>>1;
	if(l<=mid)
	{
		jf(u<<1,l,r,w);
	}
	if(r>mid)
	{
		jf(u<<1|1,l,r,w);
	}
	push_up(u);
}
ll cx(ll u,ll l,ll r)
{
	if(tr[u].l>=l&&tr[u].r<=r)
	{
		return tr[u].sum;
	}
	push_down(u);
	ll mid=tr[u].l+tr[u].r>>1,ans=0;
	if(l<=mid)
	{
		ans+=cx(u<<1,l,r);
		ans%=p;
	}
	if(mid<r)
	{
		ans+=cx(u<<1|1,l,r);
		ans%=p;
	}
	return ans;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	ll g,x,y,k;
	while(m--)
	{
		scanf("%lld",&g);
		if(g==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			cf(1,x,y,k);
		}
		else if(g==2)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			jf(1,x,y,k);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",cx(1,x,y));
		}
	}
	return 0;
}

代码有点丑,感谢各位大佬qwq

2022/7/13 11:21
加载中...