大佬求条
查看原帖
大佬求条
1101546
chenxu11楼主2024/12/19 20:13

我的代码

#include<bits/stdc++.h>
#define lc x*2
#define rc x*2+1
#define ll long long
using namespace std;
struct node{
	ll l,r,ans,lazy1,lazy2;
}t[500005*4];
ll n,q,x,y,k,op,a[500005],m;
void build(ll x,ll l,ll r){
	t[x].lazy1=0,t[x].lazy2=1;
	t[x].l=l,t[x].r=r;
	if(l==r){
		t[x].ans=a[l]%m;
		return;
	}
	ll mid=(l+r)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	t[x].ans=(t[lc].ans+t[rc].ans)%m;
	
}
void down(ll x){
	t[lc].lazy1=(t[lc].lazy1*t[x].lazy2+t[x].lazy1)%m;
	t[rc].lazy1=(t[rc].lazy1*t[x].lazy2+t[x].lazy1)%m;
	t[lc].lazy2=(t[lc].lazy2*t[x].lazy2)%m;
	t[rc].lazy2=(t[rc].lazy2*t[x].lazy2)%m;
	t[lc].ans=(t[x].lazy1*(t[lc].r-t[lc].l+1)%m+t[lc].ans*t[x].lazy2%m)%m;
	t[rc].ans=(t[x].lazy1*(t[rc].r-t[rc].l+1)%m+t[rc].ans*t[x].lazy2%m)%m;
	t[x].lazy1=0;t[x].lazy2=1; 
}
void cxa(ll x,ll l,ll r,ll k){
	if(t[x].l>=l&&t[x].r<=r){
		t[x].ans+=k*(t[x].r-t[x].l+1)%m;
		t[x].lazy1+=k;
		return;
	}
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) cxa(lc,l,r,k);
	if(r>mid)  cxa(rc,l,r,k);
	t[x].ans=(t[lc].ans+t[rc].ans)%m;
}
void cza(ll x,ll l,ll r,ll k){
	if(t[x].l>=l&&t[x].r<=r){
		t[x].ans=t[x].ans*k%m;
		t[x].lazy1=t[x].lazy1*k;
		t[x].lazy2=t[x].lazy2*k;
		return;
	}
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) cza(lc,l,r,k);
	if(r>mid)  cza(rc,l,r,k);
	t[x].ans=(t[lc].ans+t[rc].ans)%m;
}
long long sum(ll x,ll l,ll r){
	long long s=0;
	if(t[x].l>=l&&t[x].r<=r)
		return t[x].ans;
	down(x);
	ll mid=(t[x].l+t[x].r)/2;
	if(l<=mid) s+=sum(lc,l,r);
	s%=m;
	if(r>mid)  s+=sum(rc,l,r);
	return s%m;
}
int main(){
	cin>>n>>q>>m;
	for(ll i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(q--){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			cxa(1,x,y,k);
		}
		if(op==2){
			cin>>k;
			cza(1,x,y,k);
		}
		if(op==3) 
			cout<<sum(1,x,y)<<"\n";
	}
	return 0;
}
2024/12/19 20:13
加载中...