30pts 过1 2 4测试点 其他全wa求调
查看原帖
30pts 过1 2 4测试点 其他全wa求调
1042404
kuuuun楼主2025/7/25 05:47

代码如下

#include<bits/stdc++.h>
#define ll long long
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
using namespace std;
struct tree
{
	ll l,r,val,mlazy,alazy,len;
	tree(){mlazy=1,alazy=0,val=0,len=0;}
}tr[400001];
ll n,m,a[100001],mod,q,x,y,z;
void pushdown(ll id)
{
	tr[lson(id)].mlazy*=tr[id].mlazy,tr[rson(id)].mlazy*=tr[id].mlazy;
	tr[lson(id)].alazy*=tr[id].mlazy,tr[rson(id)].alazy*=tr[id].mlazy;
	tr[lson(id)].alazy+=tr[id].alazy,tr[rson(id)].alazy+=tr[id].alazy;
	tr[lson(id)].val*=tr[id].mlazy,tr[rson(id)].val*=tr[id].mlazy;
	tr[lson(id)].val%=mod,tr[rson(id)].val%=mod;
	tr[lson(id)].val+=tr[id].alazy*tr[lson(id)].len,tr[rson(id)].val+=tr[id].alazy*tr[rson(id)].len;
	tr[id].mlazy=1,tr[id].alazy=0;
	tr[lson(id)].val%=mod,tr[rson(id)].val%=mod;
	return;
}
void build(ll id,ll l,ll r)
{
	tr[id].l=l,tr[id].r=r,tr[id].len=r-l+1;
	if(l==r)
	{
		tr[id].val=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(lson(id),l,mid),build(rson(id),mid+=1,r);
	tr[id].val=(tr[lson(id)].val+tr[rson(id)].val)%mod;
	return;
}
void add(ll id,ll l,ll r,ll z)
{
	if(tr[id].r<l||tr[id].l>r)return;
	if(tr[id].l>=l&&tr[id].r<=r)
	{
		tr[id].alazy+=z,tr[id].val+=z*tr[id].len;
		return;
	}
	pushdown(id);
	add(lson(id),l,r,z),add(rson(id),l,r,z);
	tr[id].val=(tr[lson(id)].val+tr[rson(id)].val)%mod;
	return;
}
void mul(ll id,ll l,ll r,ll z)
{
    if (tr[id].r<l||tr[id].l>r)return;
	if(tr[id].l>=l&&tr[id].r<=r)
	{
		tr[id].val*=z,tr[id].mlazy*=z,tr[id].alazy*=z;
		return;
	}
	pushdown(id);
	mul(lson(id),l,r,z),mul(rson(id),l,r,z);
	tr[id].val=(tr[lson(id)].val+tr[rson(id)].val)%mod;
	return;
}
ll query(ll id,ll l,ll r)
{
	if(tr[id].r<l||tr[id].l>r)return 0;
	if(tr[id].l>=l&&tr[id].r<=r)return tr[id].val;
	pushdown(id);
	return (query(lson(id),l,r)+query(rson(id),l,r))%mod;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		// for(ll j=1;j<=2*n;j++)printf("id%lld v%lld m%lld a%lld l%lld r%lld\n",j,tr[j].val,tr[j].mlazy,tr[j].alazy,tr[j].l,tr[j].r);
		// printf("\n");
		scanf("%lld%lld%lld",&q,&x,&y);
		if(q==1)
		{
			scanf("%lld",&z);
			mul(1,x,y,z);
		}
		else if(q==2)
		{
			scanf("%lld",&z);
			add(1,x,y,z);
		}
		else
		{
			printf("%lld\n",query(1,x,y)%mod);
			// for(ll j=1;j<=2*n;j++)printf("id%lld v%lld m%lld a%lld l%lld r%lld\n",j,tr[j].val,tr[j].mlazy,tr[j].alazy,tr[j].l,tr[j].r);
			// printf("\n\n\n");
		}
	}
    return 0;
}
2025/7/25 05:47
加载中...