30pts求调,已经看了一些警示后人无果
查看原帖
30pts求调,已经看了一些警示后人无果
169594
Heart_Of_Iron_4楼主2024/11/24 12:03
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mid ((l+r)/2)
int mod,n,q,a[1000100],ta[1000100],tc[1000100],o[500100],t1,t2,t3,t4;
void push_down_mod(int k,int l,int r)
{
	a[k]%=mod;
	a[k*2]%=mod;
	a[k*2+1]%=mod;
	tc[k*2]%=mod;
	tc[k*2+1]%=mod;
	ta[k*2]%=mod;
	ta[k*2+1]%=mod;
}
void push_down_chen(int k,int l,int r)
{
	if(l!=r)
	{
		a[k*2]*=tc[k];
		a[k*2+1]*=tc[k];
		tc[k*2]*=tc[k];
		tc[k*2+1]*=tc[k];
		ta[k*2]*=tc[k];
		ta[k*2+1]*=tc[k];
	}
	tc[k]=1;
	push_down_mod(k,l,r);
}
void push_down_add(int k,int l,int r)
{
	if(l!=r)
{
		a[k*2]=a[k*2]+(mid-l+1)*ta[k];
		a[k*2+1]+=(r-mid)*ta[k];
		ta[k*2]+=ta[k];
		ta[k*2+1]+=ta[k];
	}
	ta[k]=0;
	push_down_mod(k,l,r);
}
void push_down(int k,int l,int r)
{
	push_down_add(k,l,r);
	push_down_chen(k,l,r);
	push_down_mod(k,l,r);
}
void push_up(int k)
{
	a[k]=(a[k*2+1]+a[k*2])%mod;
}
void build(int k,int l,int r)
{
	tc[k]=1;
	if(l==r)
	{
		a[k]=o[l]%mod;
		return;
	}
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	push_up(k);
}
void add(int k,int l,int r,int ll,int rr,int x)
{
	if(l>rr||r<ll)return;
	//printf("add:%lld %lld %lld %lld %lld %lld\n",k,l,r,ll,rr,x);
	if(r<l)return;
	if(l>=ll&&r<=rr)
	{
		push_down_chen(k,l,r);
		push_down_mod(k,l,r);
		a[k]=(a[k]+x*(r-l+1))%mod;
		ta[k]=(ta[k]+x)%mod;
		return;
	}
	push_down(k,l,r);
	add(k*2,l,mid,ll,rr,x);
	add(k*2+1,mid+1,r,ll,rr,x);
	push_up(k);
}
void chen(int k,int l,int r,int ll,int rr,int x)
{
	//printf("chen:%lld %lld %lld %lld %lld %lld\n",k,l,r,ll,rr,x);
	if(l>rr||r<ll)return;
	if(r<l)return;
	if(l>=ll&&r<=rr)
	{
		push_down_add(k,l,r);
		push_down_mod(k,l,r);
		a[k]=a[k]*x%mod;
		tc[k]=tc[k]*x%mod;
		return;
	}
	push_down(k,l,r);
	chen(k*2,l,mid,ll,rr,x);
	chen(k*2+1,mid+1,r,ll,rr,x);
	push_up(k);
}
int sum(int k,int l,int r,int ll,int rr)
{
	//printf("sum:%lld %lld %lld %lld %lld\n",k,l,r,ll,rr);
	if(r<l)return 0;
	if(l>=ll&&r<=rr)
	{
		return a[k]%mod;
	}
	if(l>rr||r<ll)return 0;
	push_down(k,l,r);
	return (sum(k*2,l,mid,ll,rr)+sum(k*2+1,mid+1,r,ll,rr))%mod;
}
signed main()
{
	scanf("%lld%lld%lld",&n,&q,&mod);
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&o[i]);
		o[i]%=mod;
	}
	for(int i=1;i<=n*4;++i)
	{
		tc[i]=1;
	}
	build(1,1,n);
/*	for(int i=1;i<=n*4;++i)
	{
		printf("%lld ",a[i]);
	}
	puts("");*/
	for(int i=1;i<=q;++i)
	{
		scanf("%lld",&t1);
		if(t1==1)
		{
			scanf("%lld%lld%lld",&t2,&t3,&t4);
			chen(1,1,n,t2,t3,t4%mod);
		}
		if(t1==2)
		{
			scanf("%lld%lld%lld",&t2,&t3,&t4);
			add(1,1,n,t2,t3,t4%mod);
		}
		if(t1==3)
		{
			scanf("%lld%lld",&t2,&t3);
			printf("%lld\n",sum(1,1,n,t2,t3)%mod);
		}
		/*for(int i=1;i<=n*4;++i)
		{
			printf("%lld ",a[i]);
		}
		puts("");*/
	}
	return 0;
}
2024/11/24 12:03
加载中...