样例通过了,但是全部WA,求指点
查看原帖
样例通过了,但是全部WA,求指点
715233
Dino_chx楼主2023/2/28 19:34

不知道为什么……

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
struct ST
{
	ll sum,multag,addtag;
}tree[maxn<<2];
int a[maxn],n,m,p;
void build(int x,int l,int r)
{
	tree[x].addtag=0;
	tree[x].multag=1;
	if(l==r)
	{
		tree[x].sum=a[l]%p;
		return;
	} 
	int mid=l+r>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
	return;
}
void pushdown(int x,int l,int r)
{
	if(tree[x].multag!=1)
	{
		tree[x<<1].multag=tree[x<<1].multag*tree[x].multag%p;
		tree[x<<1|1].multag=tree[x<<1|1].multag*tree[x].multag%p;
		tree[x<<1].addtag=tree[x<<1].addtag*tree[x].multag%p;
		tree[x<<1|1].addtag=tree[x<<1|1].addtag*tree[x].multag%p;
		tree[x<<1].sum=tree[x<<1].sum*tree[x].multag%p;
		tree[x<<1|1].sum=tree[x<<1|1].sum*tree[x].multag%p;
		tree[x].multag=1; 
	}	
	if(tree[x].addtag!=0)
	{
		int mid=l+r>>1;
		tree[x<<1].addtag+=tree[x].addtag;
		tree[x<<1].addtag%=p;
		tree[x<<1|1].addtag+=tree[x].addtag;
		tree[x<<1|1].addtag%=p;
		tree[x<<1].sum+=(mid-l+1)*tree[x].addtag;
		tree[x<<1].sum%=p;
		tree[x<<1|1].sum+=(r-mid)*tree[x].addtag;
		tree[x<<1|1].sum%=p;
		tree[x].addtag=0;
	} 
	return;
}
void mul(int lq,int rq,int q,int l,int r,int x)
{
	if(lq<=l&&rq>=r)
	{
		tree[x].multag=tree[x].multag*q%p;
		tree[x].addtag=tree[x].multag*q%p;
		tree[x].sum*=q;
		return;	
	} 	
	pushdown(x,l,r);
	int mid=l+r>>1;
	if(lq<=mid)
	mul(lq,rq,q,l,mid,x<<1);
	if(rq>mid)
	mul(lq,rq,q,mid+1,r,x<<1|1);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
	return;
}
void add(int lq,int rq,int q,int l,int r,int x)
{
	if(lq<=l&&rq>=r)
	{
		tree[x].addtag+=q;
		tree[x].sum+=(r-l+1)*q%p;
		return;
	}
	pushdown(x,l,r);
	int mid=l+r>>1;
	if(lq<=mid)
	add(lq,rq,q,l,mid,x<<1);
	if(rq>mid)
	add(lq,rq,q,mid+1,r,x<<1|1);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
	return;
}
int query(int lq,int rq,int l,int r,int x)
{
	if(lq<=l&&rq>=r)
	return tree[x].sum;
	pushdown(x,l,r);
	int mid=l+r>>1,ans=0;
	if(lq<=mid)
	ans+=(query(lq,rq,l,mid,x<<1)%p);
	if(rq>mid)
	ans+=(query(lq,rq,mid+1,r,x<<1|1)%p);	
	//tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%p;
	return ans;
}
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(m--)
	{
		int op,x,y,k;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1)
		{
			scanf("%d",&k);
			mul(x,y,k,1,n,1);
		}
		if(op==2)
		{
			scanf("%d",&k);
			add(x,y,k,1,n,1);
		}
		if(op==3)
		printf("%d\n",query(x,y,1,n,1)%p);
	}
    return 0;
}

```cpp
2023/2/28 19:34
加载中...