MnZn求问线段树RE问题
查看原帖
MnZn求问线段树RE问题
1176197
ljcnoi楼主2024/12/18 21:21

rt,在本地运行时,如果把代码中所有的求余删掉,就可以完成运行,但加上之后,就莫名RE,求教大佬……

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int ls(int x){return x<<1;} 
inline int rs(int x){return x<<1|1;} 
struct TREE
{
	int l,r,sum,tag1,tag2;
};
TREE tree[400005];
int n,q,m;
int a[100005];
void pushdown(int x)
{
	if(tree[x].tag1!=1)
	{
		tree[ls(x)].tag1=(tree[ls(x)].tag1*tree[x].tag1)%m;
		tree[rs(x)].tag1=(tree[rs(x)].tag1*tree[x].tag1)%m;
		tree[ls(x)].sum=(tree[ls(x)].sum*tree[x].tag1)%m;
		tree[rs(x)].sum=(tree[rs(x)].sum*tree[x].tag1)%m;
		tree[ls(x)].tag2=(tree[ls(x)].tag2*tree[x].tag1)%m;
		tree[rs(x)].tag2=(tree[rs(x)].tag2*tree[x].tag1)%m;
		tree[x].tag1=1;
	}
	if(tree[x].tag2)
	{
		tree[ls(x)].sum=(tree[ls(x)].sum+(tree[ls(x)].r-tree[ls(x)].l+1)*tree[x].tag2)%m;
		tree[rs(x)].sum=(tree[rs(x)].sum+(tree[rs(x)].r-tree[rs(x)].l+1)*tree[x].tag2)%m;
		tree[ls(x)].tag2=(tree[ls(x)].tag2+tree[x].tag2)%m;
		tree[rs(x)].tag2=(tree[rs(x)].tag2+tree[x].tag2)%m;
		tree[x].tag2=0;
	}
}
void pushup(int x)
{
	tree[x].sum=(tree[ls(x)].sum+tree[rs(x)].sum)%m;
}
void build(int l,int r,int root)
{
	tree[root].l=l;
	tree[root].r=r;
	tree[root].tag1=1;
	if(l==r)
	{
		tree[root].sum=a[l];
	}
	else
	{
		int mid=(l+r)>>1;
		build(l,mid,ls(root));
		build(mid+1,r,rs(root));
		pushup(root);
	}
}
void ud1(int l,int r,int d,int root)
{
	if(l<=tree[root].l&&tree[root].r<=r)
	{
		tree[root].sum=(tree[root].sum*d)%m;
		tree[root].tag1=(tree[root].tag1*d)%m;
		tree[root].tag2=(tree[root].tag2*d)%m;
	}
	else
	{
		pushdown(root);
		int mid=(tree[root].l+tree[root].r)>>1;
		if(l<=mid)
		{
			ud1(l,r,d,ls(root));
		}
		if(r>=mid+1)
		{
			ud1(l,r,d,rs(root));
		}
		pushup(root);
	}
}
void ud2(int l,int r,int d,int root)
{
	if(l<=tree[root].l&&tree[root].r<=r)
	{
		tree[root].sum=tree[root].sum+d*(tree[root].r-tree[root].l+1);
		tree[root].tag2=(tree[root].tag2+d)%m;
	}
	else
	{
		pushdown(root);
		int mid=(tree[root].l+tree[root].r)>>1;
		if(l<=mid)
		{
			ud2(l,r,d,ls(root));
		}
		if(r>=mid+1)
		{
			ud2(l,r,d,rs(root));
		}
		pushup(root);
	}
}
int qu(int l,int r,int root)
{
	if(l<=tree[root].l&&tree[root].r<=r)
	{
		return tree[root].sum;
	}
	pushdown(root);
	int mid=(tree[root].l+tree[root].r)>>1,tot=0;
	if(l<=mid)
	{
		tot=(tot+qu(l,r,ls(root)))%m;
	}
	if(r>=mid+1)
	{
		tot=(tot+qu(l,r,rs(root)))%m;
	}
	return tot;
}
signed main()
{
	scanf("%lld%lld%lld",&n,&q,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	for(int i=1;i<=q;i++)
	{
		int x,y,k,q;
		scanf("%lld",&q);
		if(q==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			ud1(x,y,k,1);
		}
		else if(q==2)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			ud2(x,y,k,1);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",qu(x,y,1));
			for(int i=1;i<=m;i++)
			{
				printf("%lld ",qu(i,i,1));
			}
			printf("\n");
		}
	}
	return 0;
} 
2024/12/18 21:21
加载中...