求助 全是re
查看原帖
求助 全是re
459100
xzy6666楼主2021/9/27 17:34
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100010;
struct node
{
	ll l,r;
	ll sum=0;
	ll add=0,mu=1;
	
}tr[N*4];
ll a[N];
ll n,m,t;
void pushup(ll u)
{
	tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%t;
}
void pushdown(ll u)
{
	auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
	if(root.add || root.mu!=1)
	{
		left.add=(root.add+left.add*root.mu)%t;
		right.add=(root.add+right.add*root.mu)%t;
		left.mu=(left.mu*root.mu)%t;
		right.mu=(right.mu*root.mu)%t;
		left.sum=(left.sum*root.mu+root.add*(left.r-left.l+1))%t;
		right.sum=(right.sum*root.mu+root.add*(right.r-right.l+1))%t;
        root.add=0;
        root.mu=1;
	
	}
}

void build(ll u,ll l,ll r)
{
	tr[u]={l,r};
	if(l==r) 
	{
		tr[u].sum=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(ll u,ll l,ll r,ll add)
{
	if(tr[u].l>=l && tr[u].r<=r)
	{
	    tr[u].add=(tr[u].add+add)%t;
		tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*add)%t;
		
	}
	else
	{
		pushdown(u);
		ll mid=tr[u].l+tr[u].r>>1;
		if(r<=mid) modify(u<<1,l,r,add);
		else if(l>mid) modify(u<<1|1,l,r,add);
		else
		{
		    modify(u<<1,l,mid,add);
		    modify(u<<1|1,mid+1,r,add);
		}
		pushup(u);
	}
}
void modify1(ll u,ll l,ll r,ll mu)
{
     if(tr[u].l>=l && tr[u].r<=r)
	{
	  tr[u].sum=(tr[u].sum*mu)%t;
	  tr[u].add=(tr[u].add*mu)%t;
	  tr[u].mu=(tr[u].mu*mu)%t;
		return;
	}
	else
	{
	    pushdown(u);
	    ll mid=tr[u].l+tr[u].r>>1;
	    if(r<=mid) modify1(u<<1,l,r,mu);
	    else if(l>mid) modify1(u<<1|1,l,r,mu);
	    else
	    {
	        modify1(u<<1,l,mid,mu);
	        modify1(u<<1|1,mid+1,r,mu);
	    }
	    pushup(u);
	}
}
ll query(ll u,ll l,ll r)
{
	if(tr[u].l>=l && tr[u].r<=r) return tr[u].sum;
	else
	{
		pushdown(u);
		ll sum=0;
		ll mid=tr[u].l+tr[u].r>>1;
		if(r<=mid) sum=query(u<<1,l,r);
		 else if(l>mid) sum=query(u<<1|1,l,r);
		 else
		 {
		    sum= query(u<<1,l,mid)+query(u<<1|1,mid+1,r);
		 }
		return sum%t;
		
	}
}
int main()
{
    
	cin>>n>>m>>t;
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	while(m--)
	{
		ll op;
		ll b,c,d,e;
        scanf("%d",&op);
        if(op==2)
        {
        	scanf("%lld %lld %lld",&b,&c,&d);
			modify(1,b,c,d);
		}
		else if(op==1)
		{
			scanf("%lld %lld %lld",&b,&c,&d);
			modify1(1,b,c,d);
		}
		else
		{
			scanf("%d %d",&b,&c);
			printf("%lld\n",query(1,b,c)%t);
		}
        
	}
	return 0;
}
2021/9/27 17:34
加载中...