MnZn线段树求调
查看原帖
MnZn线段树求调
503792
Svemit楼主2022/11/20 10:03

全部输出0

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e5+5;
ll n,m,mod;
ll a[N];
struct segment_tree
{
	ll l,r,val,laz_tag_add,laz_tag_mul;
}t[N<<2];
void push_up(ll x)
{
	t[x].val=(t[x<<1].val+t[x<<1|1].val)%mod;
}

void push_down(int x)
{
	t[x<<1].val=(t[x<<1].val*t[x].laz_tag_mul+t[x].laz_tag_add*(t[x<<1].r-t[x<<1].l+1))%mod;
	t[x<<1|1].val=(t[x<<1|1].val*t[x].laz_tag_mul+t[x].laz_tag_add*(t[x<<1|1].r-t[x<<1|1].l+1))%mod;
	
	t[x<<1].laz_tag_mul=(t[x<<1].laz_tag_mul*t[x].laz_tag_mul)%mod;
	t[x<<1|1].laz_tag_mul=(t[x<<1|1].laz_tag_mul*t[x].laz_tag_mul)%mod;
	
	t[x<<1].laz_tag_add=(t[x<<1].laz_tag_add*t[x].laz_tag_mul+t[x].laz_tag_add)%mod;
	t[x<<1|1].laz_tag_add=(t[x<<1|1].laz_tag_add*t[x].laz_tag_mul+t[x].laz_tag_add)%mod;
	
	t[x].laz_tag_add=0;
	t[x].laz_tag_mul=1;
}

inline void build(ll l,ll r,ll x)
{
	t[x].l=l;
	t[x].r=r;
	t[x].laz_tag_mul=1;
	t[x].laz_tag_add=0;
	if(l==r)
	{
		t[x].val=a[l]%mod;
		return;
	}
	ll mid=l+r>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	push_up(x);
}

inline void update_add(ll nl,ll nr,ll k,ll l,ll r,ll x)
{
	if(nl<=l&&r<=nr)
	{
		t[x].val=(t[x].val+(l-r+1)*k)%mod;
		t[x].laz_tag_add=(t[x].laz_tag_add+k)%mod;
		return;
	}
	push_down(x);
	ll mid=l+r>>1;
	if(nl<=mid) update_add(nl,nr,k,l,mid,x<<1);
	if(nr>mid) update_add(nl,nr,k,mid+1,r,x<<1|1);
	push_up(x);
}

inline void update_mul(ll nl,ll nr,ll k,ll l,ll r,ll x)
{
	if(nl<=l&&r<=nr)
	{
		t[x].val=(t[x].val*k)%mod;
		t[x].laz_tag_mul=(t[x].laz_tag_mul*k)%mod;
		t[x].laz_tag_add=(t[x].laz_tag_add*k)%mod;
		return;
	}
	push_down(x);
	ll mid=l+r>>1;
	if(nl<=mid) update_add(nl,nr,k,l,mid,x<<1);
	if(nr>mid) update_add(nl,nr,k,mid+1,r,x<<1|1);
	push_up(x);
}

inline ll query(ll nl,ll nr,ll l,ll r,ll x)
{
	if(nl<=l&&r<=nr)
	{
		return t[x].val%mod;
	}
	push_down(x);
	ll mid=l+r>>1,ans=0;
	if(nl<=mid) ans=(ans+query(nl,nr,l,mid,x<<1))%mod;
	if(nr>mid) ans=(ans+query(nl,nr,mid+1,r,x<<1|1))%mod;
}
int main()
{
    cin>>n>>m>>mod;
    for(ll i=1;i<=n;i++)
      cin>>a[i];
    build(1,n,1);
    while(m--)
    {
    	ll op;
    	cin>>op;
    	if(op==1)
    	{
    		ll l,r,k;
    		cin>>l>>r>>k;
    		update_mul(l,r,k,1,n,1);
		}
		if(op==2)
		{
			ll l,r,k;
			cin>>l>>r>>k;
			update_add(l,r,k,1,n,1);
		}
		if(op==3)
		{
			ll l,r;
			cin>>l>>r;
			cout<<query(l,r,1,n,1)<<endl;
		}
	}
	return 0;
}

2022/11/20 10:03
加载中...