线段树2求调,样例过了,找不出错在哪里了(悲
查看原帖
线段树2求调,样例过了,找不出错在哪里了(悲
338203
ljj0803楼主2022/12/7 13:01

跪求各位大佬帮忙orz

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,p,m,a[100005],f[400005],jia[400005],cheng[400005],t,g,c,q;
void pushup(int i)
{
	f[i]=f[i<<1]+f[i<<1|1],f[i]%=p;
}
void build(int id,int l,int r)
{
	if(l==r) { f[id]=a[l]%p; return; }
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
void down(int id,int l,int r)
{
	f[id<<1]*=cheng[id],f[id<<1|1]*=cheng[id],f[id<<1]%=p,f[id<<1|1]%=p;
	cheng[id<<1]*=cheng[id],cheng[id<<1|1]*=cheng[id],cheng[id<<1]%=p,cheng[id<<1|1]%=p; 
	if(jia[id]==0) return;
	int mid=(l+r)>>1;
	f[id<<1]+=jia[id]*(mid-l+1),f[id<<1|1]+=jia[id]*(r-mid),f[id<<1]%=p,f[id<<1|1]%=p;
	jia[id<<1]+=jia[id],jia[id<<1|1]+=jia[id],jia[id<<1]%=p,jia[id<<1|1]%=p;
	jia[id]=0,cheng[id]=1;
}
void update(int id,int l,int r,int x,int y,int add)
{
	if(x<=l&&r<=y) { cheng[id]*=add,jia[id]*=add,f[id]*=add,f[id]%=p,cheng[id]%=p; return;	}
	down(id,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) update(id<<1,l,mid,x,y,add);
	if(mid<y) update(id<<1|1,mid+1,r,x,y,add);
	pushup(id);
}
void update1(int id,int l,int r,int x,int y,int add)
{
	if(x<=l&&r<=y) { jia[id]+=add,f[id]+=(r-l+1)*add,jia[id]%=p,f[id]%=p; return; }
	down(id,l,r);
	int mid=(l+r)>>1;
	if(x<=mid) update1(id<<1,l,mid,x,y,add);
	if(mid<y) update1(id<<1|1,mid+1,r,x,y,add);
	pushup(id);
}
int ask(int id,int l,int r,int x,int y)
{
	if(x<=l&&r<=y) return f[id];
	down(id,l,r);
	int mid=(l+r)>>1,ans=0;
	if(x<=mid) ans+=ask(id<<1,l,mid,x,y);
	if(mid<y) ans+=ask(id<<1|1,mid+1,r,x,y);
	return ans%p;
}
signed main()
{
	cin>>n>>m>>p;
	for(register int i=1;i<=n;++i) cin>>a[i];
	build(1,1,n);
	fill(cheng+1,cheng+400001,1);
	for(register int i=1;i<=m;++i)
	{
		cin>>q;
		if(q==1)
		{
			cin>>t>>g>>c;
			update(1,1,n,t,g,c);
		}
		if(q==2)
		{
			cin>>t>>g>>c;
			update1(1,1,n,t,g,c);
		}
		if(q==3)
		{
			cin>>t>>g;
			cout<<ask(1,1,n,t,g)%p<<endl;
		}
	}
	return 0;
}
2022/12/7 13:01
加载中...