求助大佬!!!线段树求大佬帮看看
查看原帖
求助大佬!!!线段树求大佬帮看看
475143
gaojian2007楼主2022/7/18 20:09
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long int n,m,a[100005],ls[400025],rs[400025],sum[400025],rt=1,addv[400025],chengv[400025],p;
void build(int x,int l,int r)
{
	chengv[x]=1;
	addv[x]=0;
	if(l==r)
	{
		sum[x]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	ls[x]=++rt;
	rs[x]=++rt;
	build(ls[x],l,mid);
	build(rs[x],mid+1,r);
	sum[x]=(sum[ls[x]]+sum[rs[x]])%p;
}
void add(int x,int l,int r,int v)
{
	addv[x]+=v;
	addv[x]%=p;
	sum[x]+=(r-l+1)*v;
	sum[x]%=p;
}
void cheng(int x,int l,int r,int v)
{
	chengv[x]*=v;
	chengv[x]%=p;
	addv[x]*=v;
	addv[x]%=p;
	sum[x]*=v;
	sum[x]%=p;
}
void pushdown(int x,int l,int r)
{
	int mid=(l+r)>>1;
	cheng(ls[x],l,mid,chengv[x]);
	cheng(rs[x],mid+1,r,chengv[x]);
	chengv[x]=1;
	add(ls[x],l,mid,addv[x]);
	add(rs[x],mid+1,r,addv[x]);
	addv[x]=0;
}
void setadd(int x,int l,int r,int nl,int nr,int v)
{
	int mid=(l+r)>>1;
	if(nl<=l&&nr>=r)
	{
		add(x,l,r,v);
		return ;
	}
	pushdown(x,l,r);
	if(nl<=mid)setadd(ls[x],l,mid,nl,nr,v);
	if(nr>mid)setadd(rs[x],mid+1,r,nl,nr,v);
	sum[x]=sum[ls[x]]+sum[rs[x]];
	sum[x]%=p;
}
void setcheng(int x,int l,int r,int nl,int nr,int v)
{
	int mid=(l+r)>>1;
	if(nl<=l&&nr>=r)
	{
		cheng(x,l,r,v);
		return ;
	}
	pushdown(x,l,r);
	if(nl<=mid)setcheng(ls[x],l,mid,nl,nr,v);
	if(nr>mid)setcheng(rs[x],mid+1,r,nl,nr,v);
	sum[x]=sum[ls[x]]+sum[rs[x]];
	sum[x]%=p;
}
long long int ans(int x,int l,int r,int nl,int nr)
{
	int mid=(l+r)>>1;
	if(nl<=l&&nr>=r)
	return sum[x];
	long long int s=0;
	pushdown(x,l,r);
	if(nl<=mid)s+=ans(ls[x],l,mid,nl,nr);
	if(nr>mid)s+=ans(rs[x],mid+1,r,nl,nr);
	s%=p;
	return s;
}
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		long long int x,y,z;
		cin>>x;
		if(x==1)
		{
			cin>>x>>y>>z;
			setcheng(1,1,n,x,y,z);
		}
		if(x==2)
		{
			cin>>x>>y>>z;
			setadd(1,1,n,x,y,z);
		}
		if(x==3)
		{
			cin>>x>>y;
			cout<<ans(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}```
2022/7/18 20:09
加载中...