30分求助
查看原帖
30分求助
1240856
hycw_czy楼主2024/7/11 16:27
#include<bits/stdc++.h>
#define int long long
#define MAXN 100010
#define mid ((l+r)>>1)
#define ls (now<<1)
#define rs ((now<<1)+1)
int sum[4*MAXN],lazyj[4*MAXN],lazyc[4*MAXN],mod;//lazyj:加法懒标记;lazyc:乘法懒标记 
void add(int &a,int b){a=(a+b)%mod;}
void mul(int &a,int b){a=(a*b)%mod;}
void up(int now){sum[now]=(sum[ls]+sum[rs])%mod;}
void work(int now,int l,int r)
{
	mul(sum[ls],lazyc[now]);add(sum[ls],lazyj[now]*(mid-l+1)%mod);
	mul(sum[rs],lazyc[now]);add(sum[rs],lazyj[now]*(r-mid)%mod);
	mul(lazyc[ls],lazyc[now]);add(lazyj[ls],lazyj[now]);
	mul(lazyc[rs],lazyc[now]);add(lazyj[rs],lazyj[now]);
	up(now);lazyj[now]=0;lazyc[now]=1;return;
}
void mm(int now,int l,int r,int L,int R,int ADD,int MUL)
{
	if(L<=l&&r<=R){mul(sum[now],MUL%mod);add(sum[now],ADD%mod*(r-l+1)%mod);mul(lazyj[now],MUL%mod);add(lazyj[now],ADD%mod);mul(lazyc[now],MUL%mod);return;}
	if(lazyc[now]!=1||lazyj[now]>0)work(now,l,r);
	if(L<=mid)mm(ls,l,mid,L,R,ADD%mod,MUL%mod);
	if(mid+1<=R)mm(rs,mid+1,r,L,R,ADD%mod,MUL%mod);
	up(now);return;
}
int query(int now,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)return sum[now]%mod;
	if(lazyc[now]!=1||lazyj[now])work(now,l,r);
	int ret=0;
	if(L<=mid)ret+=query(ls,l,mid,L,R)%mod;
	if(mid+1<=R)ret+=query(rs,mid+1,r,L,R)%mod;
	return ret%mod;
}
int n,m;
int iop,x,y,k;
signed main()
{
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++)
	{
		int b;scanf("%lld",&b);
		mm(1,1,n,i,i,b,1);
	}
	while(m--)
	{
		scanf("%lld%lld%lld",&iop,&x,&y);
		if(iop==1){scanf("%lld",&k);mm(1,1,n,x,y,0,k);}
		else if(iop==2){scanf("%lld",&k);mm(1,1,n,x,y,k,1);}
		else printf("%lld\n",query(1,1,n,x,y)%mod);
	}
	return 0;
}

谢谢啦

2024/7/11 16:27
加载中...