样例过了,但是全wa,qwq,求助大佬qwq
查看原帖
样例过了,但是全wa,qwq,求助大佬qwq
670455
ska_0x08楼主2022/6/3 19:35
#include <bits/stdc++.h>
using namespace std;
const long long Maxn=100010;
long long xds[Maxn*4],a[Maxn],addlazy[Maxn*4]={0},mullazy[Maxn*4];
long long n,m,p;
void push_up (long long rt){xds[rt]=xds[rt<<1]+xds[rt<<1|1];return ;}
void push_down (long long rt,long long ls,long long rs)
{
	xds[rt<<1]=(xds[rt<<1]+ls*addlazy[rt])%p*mullazy[rt]%p;
	xds[rt<<1|1]=(xds[rt<<1|1]+rs*addlazy[rt])%p*mullazy[rt]%p; 
	addlazy[rt<<1]+=addlazy[rt];
	addlazy[rt<<1|1]+=addlazy[rt];
	mullazy[rt<<1]*=mullazy[rt];
	mullazy[rt<<1|1]*=mullazy[rt];
	addlazy[rt]=0;
	mullazy[rt]=1;
	
	 return ;
}
void build (long long rt ,long long l,long long r)
{
	if(l==r){xds[rt]=a[l]%p;mullazy[l]=1%p;return ;}
	long long m=(l+r)>>1;
	build(rt<<1,l,m);
	build(rt<<1|1,m+1,r);
	push_up(rt);
}
void addchange (long long rt,long long l,long long r,long long L,long long R,long long num)
{
	if(L<=l&&r<=R)
	{
		xds[rt]+=(r-l+1)*num%p;
		addlazy[rt]+=num%p;
		return ;
	}
	long long m=(r+l)>>1;
	push_down(rt,m-l+1,r-m);
	if(L<=m) addchange(rt<<1,l,m,L,R,num);
	if(R>m)  addchange (rt<<1|1,m+1,r,L,R,num);
	push_up (rt);
	return ;
}
void mulchange (long long rt,long long l,long long r,long long L,long long R,long long num)
{
if(L<=l&&r<=R)
	{
		xds[rt]*=num%p;
		mullazy[rt]*=num%p;
		return ;
	}
	long long m=(r+l)>>1;
	push_down(rt,m-l+1,r-m);
	if(L<=m) mulchange(rt<<1,l,m,L,R,num);
	if(R>m)  mulchange (rt<<1|1,m+1,r,L,R,num);
	push_up (rt);
	return ;
}
long long anns(long long rt,long long l,long long r,long long L,long long R)
{
	if(L<=l&&r<=R)
	{
		return xds[rt];
	}
	long long m=(l+r)>>1;
	push_down (rt,m-l+1,r-m);
	long long ans=0;
	if (L<=m) ans+=anns(rt<<1,l,m,L,R)%p;
	if (R>m)  ans+=anns(rt<<1|1,m+1,r,L,R)%p;
	return ans%p;
}
int  main()
{
	cin>>n>>m>>p;
	for(long long i=1;i<=n;i++)
	cin>>a[i];
	build(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		/*cout<<"CCF wants more money"<<endl;*/
		long long cc,b,c,d;
		cin>>cc;
		if(cc==2)
		{
			cin>>b>>c>>d;
			addchange(1,1,n,b,c,d);
		}
		if(cc==1)
		{
			cin>>b>>c>>d;
			mulchange(1,1,n,b,c,d);
		}
		if(cc==3)
		{
			cin>>b>>c;
			cout<<anns(1,1,n,b,c)<<endl;
		}
	}
	return 0;
}
2022/6/3 19:35
加载中...