写的应该对,RE整不会
查看原帖
写的应该对,RE整不会
943468
lizicheng3042楼主2023/9/14 13:56

感觉没有写错的地方但是全RE,样例和第一个点都能过

#include<cstdio>
#define ll long long
using namespace std;
ll n,m,num[100008],tree[3000005],op,lazy[3000005],lazy2[3000005],Mod;
void build(int u,int l,int r)
{
	lazy2[u]=1;
	if(l==r)
	{
		tree[u]=num[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	tree[u]=tree[u*2]+tree[u*2+1];
	tree[u]%=Mod;
//	printf("(%d,%d,%d)",l,r,tree[u]);
}
bool inrange(int l,int r,int L,int R)
{
	return l>=L&&r<=R;
}
bool outrange(int l,int r,int L,int R)
{
	return l>R||r<L;
}
void maketag(int u,int l,int r,ll k)
{
	tree[u]=(tree[u]+(r-l+1)*k)%Mod;
	lazy[u]=(k+lazy[u])%Mod;
}
void maketag2(int u,int l,int r,ll k)
{
	tree[u]=tree[u]*k%Mod;
	lazy[u]=lazy[u]*k%Mod;
	lazy2[u]=lazy2[u]*k%Mod;
}
void pushdown(int u,int l,int r)
{
	if(l!=r)
	{
		int mid=(l+r)>>1;
		maketag2(u*2,l,mid,lazy2[u]);
		maketag2(u*2+1,mid+1,r,lazy2[u]);
		maketag(u*2,l,mid,lazy[u]);
		maketag(u*2+1,mid+1,r,lazy[u]);
	}
	lazy[u]=0;lazy2[u]=1;
}
void update(int u,int L,int R,int l,int r,ll k)
{
	if(inrange(l,r,L,R))
	{
//	    printf("(%d,%d,%d)",l,r,tree[u]);
		maketag(u,l,r,k);
//	    printf("(%d,%d,%d)",l,r,tree[u]);
		return;
	}
	else if(!outrange(l,r,L,R))
	{
		int mid=(l+r)>>1;
		if(lazy2[u]!=1||lazy[u])
		{
			pushdown(u,l,r);
		}
		update(u*2,L,R,l,mid,k);
		update(u*2+1,L,R,mid+1,r,k);
		tree[u]=tree[u*2]+tree[u*2+1];
	}
}
void update2(int u,int L,int R,int l,int r,ll k)
{
	if(inrange(l,r,L,R))
	{
		maketag2(u,l,r,k);
		return;
	}
	else if(!outrange(l,r,L,R))
	{
		int mid=(l+r)>>1;
		if(lazy2[u]!=1||lazy[u])
		{
			pushdown(u,l,r);
		}
		update2(u*2,L,R,l,mid,k);
		update2(u*2+1,L,R,mid+1,r,k);
		tree[u]=tree[u*2]+tree[u*2+1];
	}
}
ll query(int u,int L,int R,int l,int r)
{
//	printf("(%d,%d,%d)",l,r,tree[u]);
	if(inrange(l,r,L,R))
		return tree[u];
	else if(!outrange(l,r,L,R))
	{
		if(lazy[u]||lazy2[u]!=1)
		    pushdown(u,l,r);
		int mid=(l+r)>>1;
		return query(u*2,L,R,l,mid)+query(u*2+1,L,R,mid+1,r);
	}
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&Mod);
	for(int a=1;a<=n;a++)
	{
		scanf("%lld",&num[a]);
	}
	build(1,1,n);
	while(m--)
    {
    	scanf("%d",&op);
    	if(op==2)
    	{
    		int l,r,d;
    		scanf("%d%d%d",&l,&r,&d);
    		update(1,l,r,1,n,d);
		}
    	else if(op==1)
    	{
    		int l,r,d;
    		scanf("%d%d%d",&l,&r,&d);
    		update2(1,l,r,1,n,d);
		}
		else
    	{
    		int l,r;
    		scanf("%d%d",&l,&r);
    		printf("%lld\n",query(1,l,r,1,n)%Mod);
		}
	}
	return 0;
}
2023/9/14 13:56
加载中...