30pts求调
查看原帖
30pts求调
1041884
_Liyx_楼主2024/8/31 20:28
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,mod;
ll a[100005],d[10000005],b[10000005],ch[10000005];
ll op,x,y,k;
void build(ll l,ll r,ll p){
	ch[p]=1; 
	if(l==r){
		d[p]=a[l];
		return;
	}
	ll mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mod;
	return;
}
ll get(ll s,ll t,ll l,ll r,ll p){
	if(s<=l&&r<=t) return d[p];
	ll mid=(l+r)/2;
	ll sum=0;
	if(ch[p]){
		d[p*2]=d[p*2]*ch[p]%mod;
		d[p*2+1]=d[p*2+1]*ch[p]%mod;
		ch[p*2]=ch[p*2]*ch[p]%mod;
		ch[p*2+1]=ch[p*2+1]*ch[p]%mod;
		ch[p]=0;
	}
	if(b[p]){
		d[p*2]+=b[p]*(mid-l+1)%mod;
		d[p*2+1]+=b[p]*(r-mid)%mod;
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		b[p]=0;
	}
	if(s<=mid) sum+=get(s,t,l,mid,p*2);
	if(t>mid) sum+=get(s,t,mid+1,r,p*2+1);
	sum%=mod;
	return sum;
}
void update(ll s,ll t,ll l,ll r,ll p,ll c){
	if(s<=l&&r<=t){
		d[p]+=(r-l+1)*c;
		b[p]+=c;
		b[p]%=mod;
		return;
	}
	ll mid=(l+r)/2;
	if(ch[p]){
		d[p*2]=d[p*2]*ch[p]%mod;
		d[p*2+1]=d[p*2+1]*ch[p]%mod;
		ch[p*2]=ch[p*2]*ch[p]%mod;
		ch[p*2+1]=ch[p*2+1]*ch[p]%mod;
		ch[p]=1;
	}
	if(b[p]){
		d[p*2]+=b[p]*(mid-l+1)%mod;
		d[p*2+1]+=b[p]*(r-mid)%mod;
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		b[p]=0;
	}
	if(s<=mid) update(s,t,l,mid,p*2,c);
	if(t>mid) update(s,t,mid+1,r,p*2+1,c);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mod;
}
void upd(ll s,ll t,ll l,ll r,ll p,ll c){
	if(s<=l&&r<=t){
		d[p]=d[p]*c%mod;
		ch[p]*=c;
		ch[p]%=mod;
		b[p]*=c;
		b[p]%=mod;
		return;
	}
	ll mid=(l+r)/2;
	if(ch[p]){
		d[p*2]=d[p*2]*ch[p]%mod;
		d[p*2+1]=d[p*2+1]*ch[p]%mod;
		ch[p*2]=ch[p*2]*ch[p]%mod;
		ch[p*2+1]=ch[p*2+1]*ch[p]%mod;
		ch[p]=1;
	}
	if(b[p]){
		d[p*2]+=b[p]*(mid-l+1)%mod;
		d[p*2+1]+=b[p]*(r-mid)%mod;
		b[p*2]+=b[p];
		b[p*2+1]+=b[p];
		b[p]=0;
	}
	if(s<=mid) upd(s,t,l,mid,p*2,c);
	if(t>mid) upd(s,t,mid+1,r,p*2+1,c);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mod;
}
int main(){
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			upd(x,y,1,n,1,k);
		}
		else if(op==2){
			cin>>k;
			update(x,y,1,n,1,k);
		}
		else if(op==3){
			cout<<get(x,y,1,n,1)<<"\n";
		}
	}
	return 0;
}
2024/8/31 20:28
加载中...