大佬瞅一下,30分,对,就是那个30分
查看原帖
大佬瞅一下,30分,对,就是那个30分
244456
dz_zhhx楼主2020/8/24 16:35
#include<bits/stdc++.h>
using namespace std;
long long n,m,p;
long long c,x,y,k;
long long tag1[100001],tag2[100001];
long long shu[1000001],ru[100001];
void upbuild(int rt) {shu[rt]=shu[rt<<1]+shu[rt<<1|1];tag2[rt]=1;}
void up(int rt) {shu[rt]=shu[rt<<1]+shu[rt<<1|1];}
void build(long long rt,long long l,long long r)
{
	if(l==r)
	{
		shu[rt]=ru[l];
		tag2[rt]=1;
		return;
	}
	long long mid=(l+r)/2;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	upbuild(rt);
}
void down(long long rt,long long ln,long long rn)
{
	
	shu[rt<<1]*=tag2[rt];
	shu[rt<<1]%=p;
	tag2[rt<<1]*=tag2[rt];
	tag2[rt<<1]%=p;
	shu[rt<<1]+=(tag1[rt]*ln);
	shu[rt<<1]%=p;
	tag1[rt<<1]=tag1[rt<<1]*tag2[rt]%p+tag1[rt];
	tag1[rt<<1]%=p;
	
	if(!tag2[rt]) tag2[rt]=1;
	if(!tag2[rt<<1]) tag2[rt<<1]=1;
	if(!tag2[rt<<1|1]) tag2[rt<<1|1]=1;
	
	shu[rt<<1|1]*=tag2[rt];
	shu[rt<<1|1]%=p;
	tag2[rt<<1|1]*=tag2[rt];
	tag2[rt<<1|1]%=p;
	shu[rt<<1|1]+=(tag1[rt]*rn);
	shu[rt<<1|1]%=p;
	tag1[rt<<1|1]=tag1[rt<<1|1]*tag2[rt]%p+tag1[rt];
	tag1[rt<<1|1]%=p;
	
	if(!tag2[rt]) tag2[rt]=1;
	if(!tag2[rt<<1]) tag2[rt<<1]=1;
	if(!tag2[rt<<1|1]) tag2[rt<<1|1]=1;
	
	tag1[rt]=0;
	tag2[rt]=1;
	return;
}
void jia(long long rt,long long l,long long r,long long L,long long R,long long mem)
{
	if(l>R||r<L) return;
	long long mid=(l+r)/2;
	long long ln=mid-l+1,rn=r-mid;
	if(L<=l&&r<=R)
	{
		shu[rt]+=mem*(ln+rn);
		shu[rt]%=p;
		tag1[rt]+=mem;
		return;
	}
	down(rt,ln,rn);
	jia(rt<<1,l,mid,L,R,mem);
	jia(rt<<1|1,mid+1,r,L,R,mem);
	up(rt);
}
void che(long long rt,long long l,long long r,long long L,long long R,long long mem)
{
	if(l>R||r<L) return;
	if(L<=l&&r<=R)
	{
		shu[rt]*=mem;
		shu[rt]%=p;
		tag1[rt]*=mem;
		tag2[rt]*=mem;
		return;
	}
	long long mid=(l+r)/2;
	down(rt,mid-l+1,r-mid);
	che(rt<<1,l,mid,L,R,mem);
	che(rt<<1|1,mid+1,r,L,R,mem);
	up(rt);
}
long long cha(long long rt,long long l,long long r,long long L,long long R)
{
	if(l>R||r<L) return 0;
	if(L<=l&&r<=R)
		return shu[rt];
	long long mid=(l+r)/2;
	down(rt,mid-l+1,r-mid);
	long long ans=cha(rt<<1,l,mid,L,R);
	ans%=p;
	ans+=cha(rt<<1|1,mid+1,r,L,R);
	ans%=p;
	return ans;
}
int main()
{
//	freopen("in.in","r",stdin);
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
	   cin>>ru[i];
	build(1,1,n);
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		if(c==1)
		{
			cin>>x>>y>>k;
			che(1,1,n,x,y,k);
		}
		if(c==2)
		{
			cin>>x>>y>>k;
			jia(1,1,n,x,y,k);
		}
		if(c==3)
		{
			cin>>x>>y;
			long long ans=cha(1,1,n,x,y);
			cout<<ans<<endl;
		}
	}
	return 0;
}

调不出来

2020/8/24 16:35
加载中...