0分求条 包关的
查看原帖
0分求条 包关的
1282994
kunkunbound楼主2024/11/19 20:01
#include<bits/stdc++.h>
#define ll long long
#define MAXN 200005
using namespace std;
ll a1,b,c,d,e,ff,q,mm;
ll n,m,a[MAXN],ans[MAXN<<2],add[MAXN<<2],mul[MAXN<<2];
void scan()
{
    cin>>n>>q>>mm;
    for(ll i=1;i<=n;i++)
    scanf("%lld",&a[i]);
}
void push_up(ll p)
{
	ans[p]=ans[p*2]+ans[p*2+1];
	ans[p]%=mm;
}
void build(ll p,ll l,ll r)
{
	add[p]=0;mul[p]=1;
	if(l==r)
	{
		ans[p]=a[l];
		ans[p]%=mm;
		return;
	}
	ll mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	push_up(p);
}
void f(ll p,ll l,ll r,ll ka,ll km)//*
{
	if(ka!=0)
	{
		ans[p]=(ans[p]+(r-l+1)*ka%mm)%mm;
		add[p]=(add[p]+ka%mm)%mm;
	}
	if(mul[p]!=1)
	{
		ans[p]=(ans[p]*(km%mm))%mm;
		add[p]=(add[p]*(km%mm))%mm;
		mul[p]=(mul[p]*(km%mm))%mm;
	}
}
void push_down(ll p,ll l,ll r)
{
	ll mid=(l+r)/2;
	f(p*2,l,mid,add[p],mul[p]);//*
	f(p*2+1,mid+1,r,add[p],mul[p]);
	add[p]=0;mul[p]=1;
}
void ad(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
	if(l>=nl&&r<=nr)
	{
		ans[p]+=((r-l+1)*k);
		ans[p]%=mm;
		add[p]+=k;
		add[p]%=mm;
		return;
	}
	push_down(p,l,r);
	ll mid=(r+l)/2;
	if(nl<=mid)ad(nl,nr,l,mid,p*2,k);
	if(nr>mid)ad(nl,nr,mid+1,r,p*2+1,k);
	push_up(p);
}
void mu(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
	if(l>=nl&&r<=nr)
	{
		ans[p]=ans[p]*(k%mm)%mm;
		add[p]=add[p]*(k%mm)%mm;
		mul[p]=mul[p]*(k%mm)%mm;
		return;
	}
	push_down(p,l,r);
	ll mid=(r+l)/2;
	if(nl<=mid)mu(nl,nr,l,mid,p*2,k);
	if(nr>mid)mu(nl,nr,mid+1,r,p*2+1,k);
	push_up(p);
}
ll query(ll nl,ll nr,ll l,ll r,ll p)
{
	//*
	ll sum=0;
	if(nl<=l&&nr>=r)return ans[p]%mm;
	ll mid=(l+r)>>1;
	push_down(p,l,r);
	if(nl<=mid)sum+=query(nl,nr,l,mid,p*2);
	if(nr>mid)sum+=query(nl,nr,mid+1,r,p*2+1);
	return sum%mm;
}
int main()
{
    scan();
    build(1,1,n);
    while(q--)
    {
        scanf("%lld",&a1);
        switch(a1)
        {
            case 1:{
                scanf("%lld%lld%lld",&b,&c,&d);
                mu(b,c,1,n,1,d);
                break;
            }
            case 2:{
                scanf("%lld%lld%lld",&b,&c,&d);
                ad(b,c,1,n,1,d);
                break;
            }
            case 3:{
                scanf("%lld%lld",&e,&ff);
                printf("%lld\n",query(e,ff,1,n,1));
                break;
            }
        }
    }
    return 0;
}
2024/11/19 20:01
加载中...