30分求助QWQ
查看原帖
30分求助QWQ
623089
ZZ_WYZ楼主2024/9/9 19:44
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll d[400010],a[400010],mo,b[400010],bb[400010];
void build(ll l,ll r,ll p){
	if(l==r){
		d[p]=a[l];
		return;
	}
	ll m=l+(r-l)/2;
	build(l,m,p*2);
	build(m+1,r,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mo;
}//建树
void sp(ll l,ll r,ll p){
	ll m=l+(r-l)/2;
	if(bb[p]!=1){
		bb[p*2]*=bb[p];bb[p*2]%=mo;
		bb[p*2+1]*=bb[p];bb[p*2+1]%=mo;
		b[p*2]*=bb[p];b[p*2]%=mo;
		b[p*2+1]*=bb[p];b[p*2+1]%=mo;
		d[p*2]*=bb[p];d[p*2]%=mo;
		d[p*2+1]*=bb[p];d[p*2+1]%=mo;
	}bb[p]=1;
	if(b[p]){
		b[p*2]+=b[p];b[p*2+1]+=b[p];
		b[p*2]%=mo;b[p*2+1]%=mo;
		d[p*2]+=b[p]*(m-l+1);d[p*2]%=mo;
		d[p*2+1]+=b[p]*(r-m);d[p*2+1]%=mo;
	}b[p]=0;
	return;
}//释放标记;
void updatea(ll l,ll r,ll c,ll s,ll t,ll p){
	if(s>=l&&t<=r){
		d[p]+=c*(t-s+1);d[p]%=mo;
		b[p]+=c;b[p]%=mo;
		return;
	}
	sp(s,t,p);
	ll m=s+(t-s)/2;
	if(l<=m)updatea(l,r,c,s,m,p*2);
	if(r>m)updatea(l,r,c,m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mo;
}//区间加;
void updatec(ll l,ll r,ll c,ll s,ll t,ll p){
	if(s>=l&&t<=r){
		d[p]*=c;d[p]%=mo;
		b[p]*=c;b[p]%=mo;
		bb[p]*=c;bb[p]%=mo;
		return;
	}
	sp(s,t,p);
	ll m=s+(t-s)/2;
	if(l<=m)updatec(l,r,c,s,m,p*2);
	if(r>m)updatec(l,r,c,m+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
	d[p]%=mo;
}//区间乘;
ll getsum(ll l,ll r,ll s,ll t,ll p){
	if(s>=l&&t<=r){
		d[p]%=mo;
		return d[p];
	}
	ll m=s+(t-s)/2;
	ll sum=0;
	sp(s,t,p);
	if(l<=m)sum+=getsum(l,r,s,m,p*2);
	if(r>m)sum+=getsum(l,r,m+1,t,p*2+1);
	sum%=mo;
	return sum;
}//求和
ll n,q,op,x,y,k;
ll ans;
int main(){
	cin>>n>>mo;
	for(int i=1;i<=n;i++){
		bb[i]=1;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	cin>>q;
	for(int i=0;i<q;i++){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			updatec(x,y,k,1,n,1);
		}
		if(op==2){
			cin>>k;
			updatea(x,y,k,1,n,1);
		}
		if(op==3){
			cout<<getsum(x,y,1,n,1)%mo<<endl;
		}
	}
	return 0;
}
2024/9/9 19:44
加载中...