0pts 样例能过 求调 谢谢
查看原帖
0pts 样例能过 求调 谢谢
749268
tuliwen233楼主2024/10/23 22:47
#include<bits/stdc++.h>
#define p1 p<<1
#define p2 (p<<1)+1
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,a[N],t[N<<2],op,mod,f1[N<<2],f2[N<<2];//f1 *  f2 +
void build(int l,int r,int p)
{
	if(l==r)
	{
		t[p]=a[l];
		t[p]%=mod;
		return ;
	}
	int mid=l+( (r-l) >>1);
	build(l,mid,p1),build(mid+1,r,p2);
	t[p]=(t[p1]+t[p2])%mod;
}
void upd(int l,int r,int x,int y,int z,int p)
{
	if(l<=x && y<=r)
	{
		if(op==1)
		{
			f1[p]*=z;
			t[p]*=z%mod;
			t[p]%=mod;
		}else{
			f2[p]+=z;
			t[p]+=( (y-x+1)*z )%mod;
			t[p]%=mod;
		}
		return ;
	}
	int mid=x+( (y-x) >>1);
	if(f1[p]>1 && x!=y)
	{
		t[p1]*=f1[p],t[p2]*=f1[p];
		t[p1]%=mod,t[p2]%=mod;
		f1[p1]*=f1[p],f1[p2]*=f1[p];
		f2[p1]*=f1[p],f2[p2]*=f1[p];
		f1[p1]%=mod,f2[p2]%=mod;
		f2[p1]%=mod,f2[p2]%=mod;
		f1[p]=1;
	}
	if(f2[p] && x!=y)
	{
		t[p1]+=( f2[p]*(mid-x+1) )%mod,t[p2]+=( f2[p]*(y-mid) )%mod;
		t[p1]%=mod,t[p2]%=mod;
		f2[p1]+=f2[p],f2[p2]+=f2[p];
		f2[p1]%=mod,f2[p2]%=mod;
		f2[p]=0;
	}
	if(l<=mid) upd(l,r,x,mid,z,p1);
	if(r>mid) upd(l,r,mid+1,y,z,p2);
	t[p]=(t[p1]+t[p2])%mod;
}
int find(int l,int r,int x,int y,int p)
{
	if(l<=x && y<=r) return t[p];
	int mid=x+( (y-x) >>1);
	if(f1[p]>1)
	{
		t[p1]*=f1[p],t[p2]*=f1[p];
		t[p1]%=mod,t[p2]%=mod;
		f1[p1]*=f1[p],f1[p2]*=f1[p];
		f2[p1]*=f1[p],f2[p2]*=f1[p];
		f1[p1]%=mod,f2[p2]%=mod;
		f2[p1]%=mod,f2[p2]%=mod;
		f1[p]=1;
	}
	if(f2[p])
	{
		t[p1]+=( f2[p]*(mid-x+1) )%mod,t[p2]+=( f2[p]*(y-mid) )%mod;
		t[p1]%=mod,t[p2]%=mod;
		f2[p1]+=f2[p],f2[p2]+=f2[p];
		f2[p1]%=mod,f2[p2]%=mod;
		f2[p]=0;
	}
	int sum=0;
	if(l<=mid) sum+=( find(l,r,x,mid,p1) )%mod,sum%=mod;
	if(r>mid) sum+=( find(l,r,mid+1,y,p2) )%mod,sum%=mod;
	t[p]=(t[p1]+t[p2])%mod;
	return sum%mod;
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=(n<<2);i++) f1[i]=1;
	build(1,n,1);
	while(m--)
	{
		scanf("%lld",&op);
		int x,y,z;
		scanf("%lld%lld",&x,&y);
		if(op==1)
		{
			scanf("%lld",&z);
			upd(x,y,1,n,z,1);
		}else if(op==2)
		{
			scanf("%lld",&z);
			upd(x,y,1,n,z,1);
		}else if(op==3)
		{
			printf("%lld\n",find(x,y,1,n,1));
		}
	}
}
2024/10/23 22:47
加载中...