萌新的线段树样例调不过去,求助QAQ
查看原帖
萌新的线段树样例调不过去,求助QAQ
546936
Ming_Yu楼主2023/1/28 16:53

如题

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,pp;
int a[N],d[N],lazyj[N],lazyc[N];
void up(int p)
{
	d[p]=(d[p<<1]+d[p<<1|1])%p;
}
void down(int p,int l,int r,int mid)
{
	d[p<<1]=(d[p<<1]*lazyc[p]%pp+lazyj[p]*(mid-l+1))%pp;
	d[p<<1|1]=(d[p<<1|1]*lazyc[p]%pp+lazyj[p]*(r-mid))%pp;
	lazyj[p<<1]=(lazyj[p]+lazyc[p]*lazyj[p<<1]%pp)%pp;
	lazyc[p<<1]=(lazyc[p]*lazyc[p<<1])%pp;
	lazyj[p<<1|1]=(lazyj[p<<1|1]+lazyc[p]*lazyj[p<<1]%pp)%pp;
	lazyc[p<<1|1]=(lazyc[p<<1|1]*lazyc[p])%pp;
	lazyj[p]=0;
	lazyc[p]=1;
}
void build(int l,int r,int p)
{
	if(l==r)
	{
		d[p]=a[l]%pp;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	up(p);
}
void change1(int l,int r,int s,int e,int p,int ad)
{
	if(s<=l&&e>=r)
	{
		d[p]+=ad*(r-l+1)%pp;
		lazyj[p]=(lazyj[p]+ad)%pp;
		return;
	}
	int mid=(l+r)>>1;
	down(p,l,r,mid);
	if(s<=mid)change1(l,mid,s,e,p<<1,ad);
	if(e>mid)change1(mid+1,r,s,e,p<<1|1,ad);
	up(p);
}
void change2(int l,int r,int s,int e,int p,int ad)
{
	if(s<=l&&e>=r)
	{
		d[p]=(d[p]*ad)%pp;
		lazyc[p]=(lazyc[p]*ad)%pp;
		lazyj[p]=(lazyj[p]*ad)%pp;
		return;
	}
	int mid=(l+r)>>1;
	down(p,l,r,mid);
	if(s<=mid)change2(l,mid,s,e,p<<1,ad);
	if(e>mid)change2(mid+1,r,s,e,p<<1|1,ad);
	up(p);
}
int getsum(int l,int r,int s,int e,int p)
{
//	cout<<s<<" "<<e<<" "<<l<<" "<<r<<" "<<p<<endl;
	if(s<=l&&e>=r)return d[p];
	int ans=0;
	int mid=(l+r)>>1;
	down(p,l,r,mid);
	if(s<=mid)ans+=getsum(l,mid,s,e,p<<1);
	ans%=pp;
	if(e>mid)ans+=getsum(mid+1,r,s,e,p<<1|1);
	return ans%pp;
}
signed main()
{
	cin>>n>>m>>pp;
	for(int i=1; i<=n; i++)scanf("%lld",&a[i]);
	build(1,n,1);
	int mod,l,r,k;
	for(int i=1; i<=m; i++)
	{
		scanf("%lld",&mod);
		if(mod==1)
		{
			scanf("%lld%lld%lld",&l,&r,&k);
			change1(1,n,l,r,1,k);
		}
		else if(mod==2)
		{
			scanf("%lld%lld%lld",&l,&r,&k);
			change2(1,n,l,r,1,k);
		}
		else if(mod==3)
		{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",getsum(1,n,l,r,1));
		}
	}
	return 0;
}
2023/1/28 16:53
加载中...